如何在C ++中约束可调用对象的签名?

时间:2015-02-05 09:55:52

标签: c++

template<typename TCallable>
void Fun(TCallable c){
...
}

如何在不使用std :: function的情况下指示上述代码中的c必须具有某些特定签名(假设为int(double, double))?

2 个答案:

答案 0 :(得分:7)

您似乎可以添加static_assert(std::is_same<decltype(c(0.0,0.0)), int>::value, "c must take two doubles and return int")

答案 1 :(得分:4)

如果您需要针对不同Fun的多个Callable函数,那么static_assert()对您没有帮助,但您可以使用SFINAE,例如

// version for int(double,double)
template<typename Callable>
auto Fun(Callable c)
-> typename
   std::enable_if<std::is_same<decltype(c(0.0,0.0)),int>::value>::type
{ /* ... */ }

// version for int(double,double,double)
template<typename Callable>
auto Fun(Callable c)
-> typename
   std::enable_if<std::is_same<decltype(c(0.0,0.0,0.0)),int>::value>::type
{ /* ... */ }