次のコードをコンパイルする場合:は、テンプレートクラスからジェネリックのstd ::メンバ関数を呼び出すことはできません
#include <functional>
template <typename functionSignature>
class Class
{
std::function<functionSignature> func;
public:
Class(const std::function<functionSignature>& arg) : func(arg) {}
void callFunc() { func(); }
};
void f(const int i) {}
int main()
{
Class<void(const int)> a(std::bind(f, 10));
a.callFunc();
return 0;
}
VS 2015のコンパイラは、6行目に次のエラーメッセージを生成:今すぐ
error C2064: term does not evaluate to a function taking 0 arguments.
、これは、コンパイラがfunctionSignature
というと、関数の署名ではないと思うからだと私は信じています。たとえば、std::function<int()>
の代わりにstd::function<int>
にoperator()
を呼び出すと、同じエラーが発生します。
std::function
にoperator()
を呼び出せるように、テンプレート引数が常に関数の署名になることをどうすれば保証できますか?
template <typename F>
class Class;
template<typename R, typename... P>
class Class<R(P...)> {
public:
std::function<R(P...)> func;
void callFunc(P... p) { func(p...); }
};
部分特殊あなたは簡単にしたいタイプを定義することができる方法を使用することにより:
に誤った行を変更しますか? – Jts
はい、実際のMCVEが役に立ちます。あなたの 'Class 'のインスタンスを作成するおもちゃ' main'を追加し、 '.callFunc()'を実行し、コンパイルしてMSVCでエラーを生成することを確認します。 –
Yakk