模板参数:指向成员的指针 - 我该怎么办呢?

时间:2013-03-02 17:13:38

标签: c++ templates

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)没有错误

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

3 个答案:

答案 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
}