1

私は2つのvariadicクラスメンバ関数を持っています。 最初のInit(...)が呼び出されたら、2番目のクラスメンバ関数にstd :: functionを作成し、次にInit(...)の引数を関数ポインタにバインドします。std :: varadicメンバ関数への関数とその後のバリデーションテンプレート引数のバインド

それでは後で私は再びReset(...)

をすべての引数を渡すことなく、mf_()を呼び出すことができ、私はそれをテンプレートクラスを避けるとタプルの引数を保存したいと思います。

私は、次の例を動作させるためにしようとしている:私は

テンプレート引数控除を示すエラーを取得するコンパイルするとhttp://cpp.sh/4ylm

:例生きる

#include <iostream> 
#include <string> 
#include <functional> 

using namespace std; 

class Foo 
{ 
public: 
    template<typename... T> 
    void Init(T&... args) 
    { 
     cout << __func__ << endl; 
     Print(args...); 

     // bind args.. to Reset .. 
     mf_ = std::bind(&Reset, args...); 
     // mf_ = std::bind(&Foo::Reset, this, args...); ??? 
    } 

    template<typename... T> 
    void Reset(T&... args) 
    { 
     cout << __func__ << endl; 
    } 

    // std::function to Reset(...) 
    std::function<void()> mf_; 

private: 
    template<typename First> 
    void Print(First& arg) 
    { 
     cout << arg << endl; 
    } 

    template<typename First, typename... Rest> 
    void Print(First& arg, Rest&... args) 
    { 
     cout << arg << " "; 
     Print(args...); 
    } 
}; 

int main() 
{ 
    int arg1 = 1; 
    int arg2 = 2; 
    string arg3 { "test" }; 
    double arg4 = 1.10; 

    Foo foo; 
    foo.Init(arg1, arg2, arg3, arg4); 

    //foo.mf_(); 
    return 0; 
} 

リンク/置換に失敗しました:17:37:
注:テンプレートパラメータ '_Result'を推測できませんでした

+0

質問を解決しないでください。 – Barry

答えて

1

問題は、&Resetが有効なメンバーへのポインタ式ではないという点です。

あなたはポインタ・ツー・メンバーの機能を形成するために&Foo::Resetを言う必要があり、あなたもthisポインタを供給する必要があるので、あなたがして、ほぼ正しいです:ので

// mf_ = std::bind(&Foo::Reset, this, args...); ??? 

しかし、それはまだ有効ではありませんResetは関数テンプレートなので、テンプレートの特殊化を意味する必要があります。

あなたは明示的なテンプレート引数リストを提供することにより、必要な専門コンパイラ伝えることができます:

mf_ = std::bind(&Foo::Reset<T&...>, this, args...); 

やコンパイラがどの専門を推測することができます&Foo::Resetから初期化右のタイプ、の変数を作成することによってをもしかして:

または右のタイプのtypedefを作成し、その型に&Foo::Resetをキャストし

void (Foo::*f)(T&...) = &Foo::Reset; 
mf_ = std::bind(f, this, args...); 

using pmf_type = void (Foo::*)(T&...); 
    mf_ = std::bind((pmf_type)&Foo::Reset, this, args...); 
+0

ありがとう!それは働いている。私のオリジナルの質問をライブデモで更新しました – Ody

関連する問題