2016-10-16 5 views
3

、このような何かを行うことが可能です。C++テンプレートのパラメータは、C++で

+1

はどこに 'を呼び出すMethodName'の引数を取得することを計画していますか? –

+0

@EdgarRokyan Luaから渡されました。それぞれのGetArg 'はスタックから1つの引数をポップします。私は異なる 'T'のテンプレート特殊化メソッドを持っています –

+1

MethodNameは型です。物の外観から、メンバー関数ポインタが必要です。テンプレートテンプレートかもしれない? – DeiDei

答えて

3

あなたが好きな非型テンプレートパラメータを使用することができ、次のようにそれを使用する

template <typename ClassType, typename MethodType, MethodType MethodName, typename ...Args> 
static void func() { 
    ClassType t = GetPtr<ClassType>(); 
    (t->*MethodName)(GetArg<Args>()...); 
} 

A::func<B, double (B::*)(double,double), &B::sum, double, double>(); 

をあなたのコンパイラがC++ 17あなたのコードをサポートするときにも得ることができます短縮:

template <typename ClassType, auto MethodName, typename ...Args> 
static void func() { 
    ClassType t = GetPtr<ClassType>(); 
    (t->*MethodName)(GetArg<Args>()...); 
} 

用法:

A::func<B, &B::sum, double, double>(); 
+0

:「B''のメンバーではない(私が作成した'クラスB {パブリック:ダブル合計(ダブル、ダブルB){+ Bを返す;}} ')右申し訳ありません –

+0

タイプミス - 作り編集 –

+0

が働いて...この1 –

1

が正確に何を尋ねたが、私はあなたが

#include <array> 
#include <vector> 
#include <iostream> 

template <typename Class, typename Method, typename ... Args> 
void callMethod (Class & c, Method m, Args ... args) 
{ ((&c)->*m)(args...); } 

int main() 
{ 
    std::vector<int>  v; 
    std::array<int, 5U> a; 

    callMethod(v, &std::vector<int>::size); 
    callMethod(v, static_cast<void (std::vector<int>::*)(int const &)> 
        (&std::vector<int>::push_back), 7); 
    callMethod(a, &std::array<int, 5U>::fill, 3); 

    std::cout << v.back() << std::endl; // print "7" 

    for (auto const i : a) 
     std::cout << i << std::endl; // print "3" five times 
} 

のようにいろいろ書いを行うことができたとstd::vector<int>push_back()方法で、あなたは(2 push_back()があるオーバーロードあいまいさを解決するために、キャスト(static_cast<void (std::vector<int>::*)(int const &)>)を必要とすることを確認

GetPtr()GetArgs()の使用わからないが、私は

を次のように callMethod()を使用することができると仮定) std::vector<int>で単語 typenameとして
callMethod(GetPtr<B>(), &B::sum, GetArgs<double>(), 
      GetArgs<double>()); 
callMethod(GetPtr<C>(), &C::sum2, GetArgs<std::string>(), 
      GetArgs<double>(), GetArgs<double>()); 
1

はありません、これは(一般的に)動作しません、示唆、しかし:

あなたは基本的にはoperator(.)をオーバーロードするクラスを作成し、オーバーロードされたオペレータの内側に呼び出しを行うことができます。

実際には、Boost::bindはまさにその、あなたがオブジェクトとして実行時に周りに渡すことができ、「ファンクタ」のオブジェクトを取得することができます。

関連する問題