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

C++ 我们能否创建一个IF语句来确定变量是否已在C/C+中声明为指针+;,c++,pointers,if-statement,C++,Pointers,If Statement,假设变量pa始终声明为以下两种方式之一: 双倍*pa 或 双pa 我们可以创建一个执行以下操作的IF语句吗 IF(pa是指针) {pa[0]=1 } 否则 {pa=1} 编辑: 有关C++0x中的后续问题,请参见,您可以使用类型特征和decltype: #include <type_traits> if (std::is_pointer<decltype(x)>::value) { /* ... */ } 如果您没有或想要使用TR1,也可以定义自己的trait类:

假设变量
pa
始终声明为以下两种方式之一:

双倍*pa

双pa

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

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

否则 {pa=1}

编辑:


有关C++0x中的后续问题,请参见,您可以使用类型特征和
decltype

#include <type_traits>

if (std::is_pointer<decltype(x)>::value)
{
  /* ... */
}
如果您没有或想要使用TR1,也可以定义自己的trait类:

template <typename> struct is_pointer { static const bool value = false; };
template <typename T> struct is_pointer<T*> { static const bool value = true; };
模板结构是_指针{static const bool value=false;};
模板结构是_指针{static const bool value=true;};

C++0x
std::is\u 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;
};
但是,请注意,除非
pa[0]=1
pa=1
都是有效的表达式,否则此代码仍然不会编译(对于
double
double*
而言,它们是否都有效?如果您设置为
0
,则两者都对
double*
有效,但对于
double
,仍然只有第二个有效)。因此,可能您想要的不是一个明确的“如果”测试,而是一个重载函数:

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

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

set_thingy(pa);

不直接,不。假设有一种方法可以做到这一点,比如

if (__IS_POINTER(pa) {
    pa[0] = 1;
}
else {
    a = 1;
}
如果pa不是指针会发生什么?您的程序中仍然有
pa[0]=1;
语句,这是非法的,因此编译器将拒绝您的程序

原则上,您可以执行编译时测试:

#if __pa_IS_A_POINTER
pa[0] = 1;
#else
a = 1
#endif
<>但是C++预处理器的功率非常有限,它无法测试变量或表达式的类型。


如果你有这种能力,你会用它做什么?告诉我们你的实际目标是什么。

这可能可以在编译时用模板来完成。问题是:为什么?你必须在你打算使用
pa
的任何地方都这样做。什么情况需要这样做?你真正想做什么?使用
pa
在程序的其他地方声明的与在if语句上下文中声明的具体方式完全无关。即使始终只执行一个分支,两个分支都应该是可编译的。您的代码不会编译。@Nawaz:显然它说从第一个版本开始,检查修订历史;-)。因此,如果某个问题的版本在发表评论之前发生了变化,那么就不要阻止人们对该问题进行评论。你一定是在我输入代码之后,但在我添加but之前,在狭窄的窗口中加载了页面,所以无论我花了多长时间键入两行。可能是从第一个版本开始的,我跳过了阅读该部分。如果是这样的话,那么我为我的第一个评论道歉,请随意忽略它。但是,我无法查看修订历史记录,因为在
5
分钟内,您可以根据需要多次编辑您的帖子,因此不会维护任何修订历史记录。顺便说一下,最详细完整的答案是+1.:-)@纳瓦兹:对不起,当我说“显然”时,我是在开玩笑——这不是第一个版本的答案,我逐渐发布了答案,因为我想其他人可能会键入完全相同的模板和专门化,最好尽早看到他们不必麻烦。5分钟是关于我的第三个版本。好的,我明白这个答案。我将添加新的问题,以不同的方式解释我的问题。尽管可以这样做。查看
type\u traits
的任何实现,例如具有
is\u指针的Boost。
模板:但是由于你所说的原因,OP所要求的是不可能的。
template <typename T>
void set_thingy(T &t) {
    t = 1;
}

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

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

set_thingy(pa);
if (__IS_POINTER(pa) {
    pa[0] = 1;
}
else {
    a = 1;
}
#if __pa_IS_A_POINTER
pa[0] = 1;
#else
a = 1
#endif