私はここでスレッドの上に構築しようとしていました:Variable length template arguments list? デフォルトのFunctorクラスを持っているのは学問的なことです。私の目標は、クラス名、メソッド名、(可変長の)引数型があれば、テンプレートargsで指定された型の可変数の引数を取るoperator()メソッドを持つクラスを構築し、ポインタをとり、与えられたメソッドを適用します。したがって、クラスを想像してみて:C++で一般的なFunctorクラス
class MyClass
{
public:
float Fraction(float n, int m)
{
return n/m;
}
int Increment(int n)
{
return n+1;
}
} ;
そしてこうして任意の関数で使用することができるテンプレート化数子クラス:
int k = FunctorClass<MyClass, Increment, int, int /*return type*/> (3);
assert(k == 4);
float l = FunctorClass<MyClass, Fraction, float, int, float, /*return type*/> (4,3);
assert(l == (4/3));
は、このようなファンクタクラスを構築することができますか? Sidenote:バリアントテンプレートを使用します(VS2010で構築、テンプレート引数なし) ヘルプありがとう
よく考えられた答えをありがとう。はい、私の場合は非静的メンバーのためであり、オブジェクトを送信する必要があります。 これについて少し詳しく説明できますか?また、値の参照がないと完全な転送はできません。 ? ありがとうございました – user1186270
関数テンプレートがrvalue参照をパラメータとして取る場合は、C++ 2011のrvalues参照(ある種の 'T'では' T && ')と特別なテンプレート推論規則がサポートされています。これにより、パラメータがどのように渡されたか(すなわち、左辺値から来たものか、一時的なものから来たものか)を取得し、これをラップされた関数に転送することができます。 temporaryはコピーせずに通過できるので、C++ 2003では不可能な特定のコピーを防ぐことができます。しかし、完全な議論はかなり長い記事です。 –
@ user1186270:Dietmarは正しいです。それは確かにかなり長い記事にします。幸いにも誰かがすでにここに書いています:http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx – ForeverLearning