template<typename TCallable>
void Fun(TCallable c){
...
}
如何在不使用std :: function的情况下指示上述代码中的c
必须具有某些特定签名(假设为int(double, double)
)?
答案 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
{ /* ... */ }