2017-05-19 8 views
2

可変長テンプレート引数としてメンバへのポインタを渡すことは可能ですか?私は構文を理解していないようです。関数の可変長テンプレートパラメータとしてのメンバへのポインタ

それはこのように動作します呼び出す:私はクラステンプレート

と同様の方法でのparamsを渡すしたい

f(obj, &A::a, &A::b); 

:このように使用することができます

struct A 
{ 
    int a; 
    float b; 
} 

template <typename ... TArgs> void f(A *obj, TArgs ... params) 
{ 
    void *members[] { (&(obj->*params))... }; 
    // ... do something ... 
} 

template <[something] ... params> class Foo 
{ 
    void Bar(A *obj) 
    { 
     void *members[] { (&(obj->*params))... }; 
     // ... do something ... 
    } 
}; 

これは次のように使用してください:

Foo<&A::a, &A::b> foo; 
foo.bar(obj); 

私は[何か]が何であるべきかを考え出すのに困っています。

メンバーの種類が知られており、唯一つのパラメータがありますされている場合、それは次のように行うことができます。

template <int A::*ptr> //... 

はメンバーが違う不明であるメンバーポインタの可変引数パラメータリストのためにこれを一般化する方法はあります事前にタイプ?

更新:固定の既知のタイプのメンバーポインタのための可変引数引数パックがそうのように宣言されています

template<int A::*...ptr> struct Foo {}; 

は今、私は推測することができる型名とint型を交換する必要があります。

そして、C++ 17と、完璧な作品を以下:

template<auto A::*...ptr> struct Foo {}; 

残念ながら、私はあなたが別のレベルを使用することができ、C++ 14ではC++ 14

+0

多分 'template ? – Zereges

+0

残念ながら、コンパイルされません – Ghostrider

答えて

3

で動作するソリューションが必要ですそれを行うには間接の:(非型テンプレートパラメータのためのC++ 17、あなたが言及したように導入された)

struct A { 
    int a; 
    float b; 
}; 

template<typename... T> 
struct Bar { 
    template <T A::*... params> 
    struct Foo { 
     void Bar(A *obj) { 
      void *members[] { (&(obj->*params))... }; 
      // ... do something ... 
      (void)members; 
     } 
    }; 
}; 

int main() { 
    A a; 

    Bar<int, float>::Foo<&A::a, &A::b> foo; 
    foo.Bar(&a); 
} 

autoキーワードは、問題の多かれ少なかれ、この種を解決します。 std::integral_constantを考えて、最初の引数として型を指定する必要がない場合は、どのようにユーザーフレンドリーなのでしょうか...

関連する問題