たとえば、次のコードがあるとします。
class A {
public:
double operator()(double foo) {
return foo;
}
};
class B {
public:
double operator()(double foo, int bar) {
return foo + bar;
}
};
の 2 つのバージョンを書きたいと思います。1fun
つは A の署名を持つオブジェクトで動作し、もう 1 つは B の署名を持つオブジェクトで動作します。
template <typename F, typename T>
T fun(F f, T t) {
return f(t);
}
template <typename F, typename T>
T fun(F f, T t) {
return f(t, 2);
}
そして、私はこの動作を期待しています
A a();
B b();
fun(a, 4.0); // I want this to be 4.0
fun(b, 4.0); // I want this to be 6.0
もちろん、前の例では、コンパイル時にテンプレートの再定義エラーがスローされます。
B が代わりに関数である場合、次のfun
ように書き直すことができます。
template <typename T>
T fun(T (f)(T, int), T t) {
return f(t, 2);
}
fun
しかし、関数と呼び出し可能なオブジェクトの両方で作業したいと考えています。std::bind
またはを使用std::function
すると問題が解決する可能性がありますが、私は C++98 を使用しており、それらは C++11 で導入されました。