作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我坚持为 lambda 专门化模板函数:
class X
{
public:
template <typename T>
void f(T t)
{
std::cout << "awesome" << std::endl;
};
template <>
void f(double t)
{
std::cout << "trouble" << std::endl; // Works
}
template <>
void f(??? t) // what to put here?
{
std::cout << "lambda" << std::endl;
}
};
X x;
x.f(42); // prints "awesome"
x.f(1.12); // prints "trouble"
x.f([](){ std::cout << "my lazy lambda" << std::endl; }); // should print "lambda"
在传递给 f 之前将 lambda 转换为 std::function 并专用于此类型是可行的,但编写起来很乏味。 C++0x 有解决方案吗?
编辑:我完全可以接受一个解决方案,如果传递 lambda 的最后一行有效,这将使我能够专注于可调用对象。
最佳答案
以下是 sizeof 技巧的变体。也许可以单独使用 decltype 来完成。它并不完全检查它是否是 lambda,而是检查它是否可调用。如果你想过滤掉其他可调用的东西,你可以使用 C++0x 类型特征来检查它们是否是函数、成员函数、复合对象等。
#include <functional>
#include <iostream>
#include <type_traits>
template<class T>
char is_callable( const T& t, decltype( t())* = 0 );
long is_callable( ... );
class X
{
public:
template <typename T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) !=1>::type* = 0 )
{
std::cout << "awesome" << std::endl;
};
void f(double )
{
std::cout << "trouble" << std::endl; // Works
}
template<class T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) == 1>::type* = 0 )
{
std::cout << "lambda" << std::endl;
}
};
int main(int argc, const char *argv[])
{
X x;
x.f(42); // prints "awesome"
x.f(1.12); // prints "trouble"
x.f([](){ std::cout << "my lazy lambda" << std::endl; }); // should print "lambda"
}
关于templates - 用于传递 lambda 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6927874/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!