クラスを想像してみてください (VS2010 では、可変個のテンプレートはありません)
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(Arg arg){_fn(arg)};
private:
std::function<void(Arg)> _fn;
}
私はそれから例えばすることができます
FunctionWrapper <int> foo; foo.Invoke(4);
そして、これはうまくコンパイルされます。しかし、これはしません:
FunctionWrapper <void> foo; foo.Invoke();
これで、テンプレートの特殊化を使用してこれを回避できました。しかし、これを別の方法で回避できる方法があるかどうかも疑問に思いました....
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(void){_fn()}; // } overloaded
void Invoke(Arg arg){_fn(arg)}; // }
private:
std::function<void(Arg)> _fn;
}
つまり、Invoke をオーバーロードし、条件付きコンパイルで応答して、インスタンス化する
FunctionWrapper<void>
と、引数を持つ Invoke のバージョンがコンパイルされないようにします。Modern C++ design でこれを行う方法を読んだことは確かですが、詳細を思い出せません.....