1

C++ 草案说

非类型模板参数应具有以下类型之一(可选 cv 限定): — 整数或枚举类型, — 指向对象的指针或指向函数的指针, — 对对象的左值引用或对函数的左值引用, —指向成员,——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)没有错误

问题是:我看不出我应该用这样的指针做什么,没有对象实例可以使用它

4

3 回答 3

1

您将其用作常规的指向成员的指针:

template< int (MyClass::*var) > struct A 
{
   void foo()
   {
      MyClass Blah;
      Blah.*var = 3;
   }
};
于 2013-03-02T17:26:58.920 回答
1

我能想到回答这个问题的唯一方法是构建一个例子:

template< int (MyClass::*var) > struct A 
{
    A() {
        MyClass myclass;
        myclass.*var = 42;
        cout << myclass.*var << "\n";
    }
};
于 2013-03-02T17:27:17.823 回答
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
}
于 2013-03-02T19:54:57.367 回答