我们可以创建一个IF语句来确定变量是否已在C/C++中声明为指针

gam*_*123 2 c++ pointers if-statement

假设变量pa总是被声明为以下两种方式之一:

双*pa

要么

双pa

我们可以创建一个执行以下操作的IF语句

IF(pa是一个指针){pa [0] = 1}

ELSE {pa = 1}

编辑:

请参阅如何查找是否已在C++/C中填写指针数组以了解后续问题

Ste*_*sop 6

C++ 0x std::is_pointer如何工作的基础知识:

template <typename T>
struct is_pointer_helper {
    static const bool value = false;
};

template <template T>
struct is_pointer_helper<T*> {
    static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)

对于此示例,我们不希望必须使用该类型,因此我们需要一些模板参数推导:

template <typename T>
bool is_pointer(const T &) {
    return is_pointer_helper<T>::value;
}
Run Code Online (Sandbox Code Playgroud)

我们完成了:

if (is_pointer(pa)) {
    pa[0] = 1;
} else {
    pa = 1;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,此代码仍然不能编译,除非pa[0] = 1pa = 1都是有效的表达式(并没有double,也不double*是它们都有效-如果你设置0那么这两个将是有效的double*,但仍然只是第二次为double).所以你想要的可能不是一个明确的"if"测试,而是一个重载函数:

template <typename T>
void set_thingy(T &t) {
    t = 1;
}

template <typename T>
void set_thingy(T *pt) {
    set_thingy(*pt);
}

set_thingy(pa);
Run Code Online (Sandbox Code Playgroud)

或者,因为pa总是double或者double*,没有必要关注一个是指针而另一个不是指针的事实,它们只是我们需要区别对待的两种不同类型.所以不需要模板:

void set_thingy(double &d) { d = 1; }
void set_thingy(double *p) { *p = 1; }

set_thingy(pa);
Run Code Online (Sandbox Code Playgroud)

  • @Nawaz:是的,我的回答已经说过了. (2认同)