、このような何かを行うことが可能です。C++テンプレートのパラメータは、C++で
答えて
あなたが好きな非型テンプレートパラメータを使用することができ、次のようにそれを使用する
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>();
:「B''のメンバーではない(私が作成した'クラスB {パブリック:ダブル合計(ダブル、ダブルB){+ Bを返す;}} ')右申し訳ありません –
タイプミス - 作り編集 –
が働いて...この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>());
はありません、これは(一般的に)動作しません、示唆、しかし:
あなたは基本的にはoperator(.)
をオーバーロードするクラスを作成し、オーバーロードされたオペレータの内側に呼び出しを行うことができます。
実際には、Boost::bind
はまさにその、あなたがオブジェクトとして実行時に周りに渡すことができ、「ファンクタ」のオブジェクトを取得することができます。
- 1. C#テンプレートのパラメータ
- 2. テンプレート型パラメータのC++ const
- 3. C++テンプレートのパラメータを隠す
- 4. C++のテンプレート型パラメータについて
- 5. C++テンプレート非型パラメータの型推論
- 6. C#のジェネリックC++テンプレート
- 7. C++テンプレートは
- 8. テンプレート関数をパラメータとして使用するC++テンプレート関数
- 9. ansi Cのテンプレート?
- 10. vimのC++テンプレート
- 11. テンプレートのC++オブジェクトファイル
- 12. C++テンプレートのトラブル
- 13. C++テンプレートのリンクエラー
- 14. C++ "キャッチ(...)は、" パラメータ
- 15. MySQLのパラメータはC#
- 16. が再解釈は、テンプレート非型パラメータをキャスト:C++ 1Z
- 17. プリミテッドデータタイプがC++のテンプレートであるJavaテンプレート
- 18. C++でのテンプレートのインスタンス化
- 19. テンプレート以外の関数のパラメータのC++特性?
- 20. Cでのテンプレート継承エラー
- 21. C++でのテンプレート継承
- 22. テンプレートtypedef C++ 0x
- 23. C++、コンパレータとテンプレート
- 24. C++テンプレートとOpenBLAS
- 25. ペアブールとC++テンプレート
- 26. C++テンプレートSTLコンテナ
- 27. テンプレート化C++
- 28. C++テンプレートcharクラス
- 29. Cython C++テンプレート
- 30. C++テンプレート、リンクエラー
はどこに 'を呼び出すMethodName'の引数を取得することを計画していますか? –
@EdgarRokyan Luaから渡されました。それぞれのGetArg 'はスタックから1つの引数をポップします。私は異なる 'T'のテンプレート特殊化メソッドを持っています –
MethodNameは型です。物の外観から、メンバー関数ポインタが必要です。テンプレートテンプレートかもしれない? – DeiDei