如何使用lambda作为第一个参数覆盖可变参数模板
How to override a variadic template with lambda as the first parameter?
为什么下面的函数重写(lambda作为第一个参数)不工作?
template<typename ...Args>
void call(Args&& ...args) {
std::cout << "call 1";
}
template<typename ...Args>
void call(CustomObject object, Args&& ...args) {
std::cout << "call 2";
}
// see this function
template<typename ...Args>
void call(std::function<void ()>, Args&& ...args) {
std::cout << "call 3";
}
-
call()
输出 ' call 1 ' -
call(CustomObject())
输出'call 2' -
call([](){})
输出"电话1"//的
为什么call([](){})
不输出'call 3'?
我该如何声明函数让call([](){})
输出'调用3'?
编辑: @KennyTM给出了上述问题的答案。
template<typename F, typename ...Args>
auto call(F&& f, Args&& ...args)
-> typename std::enable_if<std::is_same<decltype(f()), void>::value>::type
{
std::cout << "call 3n";
}
但是…如果有参数呢?这样的:
class CustomObject {};
template<typename ...Args>
void call(std::function<void (CustomObject *)>, Args&& ...args) {
std::cout << "call 4";
}
如何让call([](CustomObject *){})
输出'调用4'?
编辑: @ildjarn给出了答案:
template<typename F, typename ...Args>
auto call(F&& f, Args&& ...)
-> typename std::enable_if<std::is_same<decltype(f( std::declval<CustomObject*>() )), void>::value>::type
{
std::cout << "call 4n";
}
lambda的类型是具有operator()
的匿名类型。它不是std::function<>
。
您可以检查第一个参数是否是调用3的函子,而不是专门化类型(demo: http://ideone.com/IQ4N6L):
)。#include <iostream>
#include <type_traits>
template<typename F, typename ...Args>
auto call(F&& f, Args&& ...args)
-> typename std::enable_if<std::is_same<decltype(f()), void>::value>::type
{
std::cout << "call 3n";
}
template<typename ...Args>
void call(Args&& ...args) {
std::cout << "call 1n";
}
int main() {
call(1);
call([](){});
}
相关文章:
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- int() 导致参数覆盖
- 为什么覆盖虚函数时需要显式模板参数?
- 如何在派生类中正确覆盖具有不同参数的函数?
- 在子类函数覆盖中省略具有默认值的参数
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- RVO 在返回之前覆盖参数中的值
- 覆盖Qt的鼠标按下事件中断移动事件参数
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 覆盖虚拟函数 - 派生类具有不同的参数
- Vim :用带参数的命令覆盖 equalprg
- 覆盖运算符多个参数
- 为什么子类覆盖虚拟函数不能更改父类的默认函数参数
- 使用参数覆盖删除
- 可变参数模板和覆盖
- 覆盖使用模板参数包扩展声明的虚拟方法时遇到问题
- 使用左参数和右参数覆盖运算符
- 相同的函数名称与不同数量的参数覆盖我的基本函数
- 使用更多参数覆盖虚拟函数
- 如何使用lambda作为第一个参数覆盖可变参数模板