C++ 如何约束C+中可调用对象的签名+;? 模板 无效乐趣(可调用c){ ... }

C++ 如何约束C+中可调用对象的签名+;? 模板 无效乐趣(可调用c){ ... },c++,C++,如果不使用std::function,我如何指示前面代码中的c必须具有某些特定的签名(比如int(double,double))呢?看起来您可以添加静态断言(std::is_same::value,“c必须接受两个double并返回int”)如果您想为不同的可调用的函数调用多个Fun函数,那么static\u assert()对您没有帮助,但您可以使用SFINAE,例如 template<typename TCallable> void Fun(TCallable c){ ... }

如果不使用std::function,我如何指示前面代码中的
c
必须具有某些特定的签名(比如
int(double,double)
)呢?

看起来您可以添加
静态断言(std::is_same::value,“c必须接受两个double并返回int”)

如果您想为不同的
可调用的
函数调用多个
Fun
函数,那么
static\u assert()
对您没有帮助,但您可以使用SFINAE,例如

template<typename TCallable>
void Fun(TCallable c){
...
}
//int的版本(双精度,双精度)
模板
自动娱乐(可调用c)
->字体名
std::enable_if::type
{ /* ... */ }
//int的版本(双精度、双精度、双精度)
模板
自动娱乐(可调用c)
->字体名
std::enable_if::type
{ /* ... */ }

通过使用而不是模板?如果您希望它是一个特定的签名,为什么它是一个模板?如果您不关心性能的影响,那么std::function将帮助您,否则,您可能不得不使用std::enable_if和type traits技巧。@tenfour因为它必须接受可调用对象,而我不想使用std::function。您希望约束有多具体,为什么?什么是
类型相同?@Walter:My bad,C++11
模板实际上就是
std::is_same>
。固定的。
// 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
{ /* ... */ }