C ++草案说明了
非类型模板参数应具有以下之一 (可选cv-qualified)类型: - 整数或枚举类型, - 指向对象的指针或指向函数的指针, - 对象的左值引用 或左值对函数的引用, - 指向成员的指针, - 的std :: nullptr_t。
在下面的代码中,我有一个指向成员的指针作为参数传递给模板
using namespace std;
class MyClass
{
public:
int membervar;
};
template< int (MyClass::*var) > struct A
{
// What am I supposed to do with *var? There isn't an object instance to use it!
};
int main(int argc, char *argv[])
{
struct A <&MyClass::membervar> object;
}
上面的代码编译(MSVC2012)没有错误
问题是:我不知道我应该用这样的指针做什么,没有一个对象实例可以使用它
答案 0 :(得分:1)
您将其用作常规 pointer-to-member :
template< int (MyClass::*var) > struct A
{
void foo()
{
MyClass Blah;
Blah.*var = 3;
}
};
答案 1 :(得分:1)
我能想到的唯一方法就是构建一个例子:
template< int (MyClass::*var) > struct A
{
A() {
MyClass myclass;
myclass.*var = 42;
cout << myclass.*var << "\n";
}
};
答案 2 :(得分:0)
没有什么能阻止A
使用MyClass
作为参数的方法:
template <int (MyClass::*var)>
struct A {
int get(MyClass const& mc) const { return mc.*var; }
void set(MyClass& mc, int i) { mc.*var = i; }
};
int main() {
MyClass mc;
A<&MyClass::membervar> a;
a.set(mc, 3);
std::cout << a.get(mc) << "\n"; // prints 3
}