1

C++ ドラフトでは、

非型テンプレート パラメータは、次の型 (オプションで cv 修飾された) の 1 つを持つものとします: — 整数型または列挙型 — オブジェクトへのポインタまたは関数へのポインタ— オブジェクトへの左辺値参照または関数への左辺値参照メンバー, — 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 に答える