#include <vector>
#include <functional>
template<class F>
class Foo
{
public:
template <class T>
void std_function(std::function<F(std::vector<T>)> functor)
{
/* something */
}
template <class T>
void func_ptr(F (*funtor)(std::vector<T>))
{
/* something else */
}
};
template<class T, class F>
F bar(std::vector<T>)
{
return F();
}
int main()
{
Foo<double> test;
std::function<double(std::vector<int>)> barz = bar<int, double>;
test.std_function(bar<int, double>); //error 1
test.std_function(barz); //OK 1
test.func_ptr(bar<int, double>); //OK 2
test.std_function(bar<int>); //error 2::1
test.func_ptr(bar<int>); //error 2::2
return 0;
}
質問1.のstd ::関数(または関数ポインタ)として(部分的に)テンプレートテンプレート関数を渡す
ラインエラー1:私は明示的にインスタンス化テンプレート関数(bar<int, double>
)を渡すしようとしていますstd::function
となりますが、合法ではありません。
ラインOK 1:私はstd::function<double(std::vector<int>)>
にbar<int, double>
をラップし、ラップファンクタを渡すと、それは今の法律です。
ラインOK 2:私はFoo::func_ptr
を通じてbar<int, double>
を渡す場合は、代わりにstd::function
の引数として関数ポインタを取得し、それはまた、合法的です。
私はラインを作りたいエラー1が合法です。行OK 2のように、bar<int, double>
をラッパーなしで渡すことができます(行OK 1と異なります)。同じフォームを使用してください。しかし、パラメータタイプは異なります。私はstd::function
として渡したい、関数ポインタではありません。
質問2.
ラインエラー2 :: 1、:: 2 2:私は、私はクラスFoo
は、そのクラステンプレートとしてbar
の戻り値の型を推論したい、ここで達成しようとしていますどのようなF
(上記コードの場合は、F
はdouble
です)。だから私はちょうどbar<int>
として渡すことができ、bar<int, double>
ではありません。
しかし、bar<int>
からFoo::func_ptr
まで渡してもエラーが発生するので、控除に失敗したようです。このコードを私の意図としてどのように機能させることができますか?エラー1の場合
:[無効counter_example(ダブル(すでに戻り値の型を指定しているので、あなたは));](http://coliru.stacked-crooked.com/a/eb9979b58f3f76e7) - テンプレート引数を渡さずに関数テンプレートを関数ポインタに変換できます。 –
Yakk
T
のために何を推測するために明示的にfunc_ptr
を伝える場合、コンパイラはあなたのためのポインタの残りの部分をインスタンス化できるようにすることができます*)(std :: vector@ヤク:ああ、私はそれを知らなかった。学習していただきありがとうございます。投稿が更新されました。 – AndyG
だから、関数ポインタを使うのがこの場合の最良の選択ですか? – Gear