gam*_*123 2 c++ pointers if-statement
假设变量pa总是被声明为以下两种方式之一:
双*pa
要么
双pa
我们可以创建一个执行以下操作的IF语句
IF(pa是一个指针){pa [0] = 1}
ELSE {pa = 1}
编辑:
请参阅如何查找是否已在C++/C中填写指针数组以了解后续问题
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] = 1和pa = 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)
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |