【发布时间】:2014-07-24 19:58:57
【问题描述】:
我写了一个快速的东西来确定给定类型(和参数)是否可以转换为普通函数指针。它的工作原理是这样的:
template <typename F, typename...Args>
struct is_stateless : std::is_convertible<F, typename std::result_of<F(Args...)>::type (*) (Args...)>::type
{};
这在大多数情况下运行良好,但它有一个严重的缺点:使用std::result_of<F(Args...)>::type。如果你不小心为你的函数提供了错误的参数(比如你遗漏了&),你会因为result_of 没有type 字段而得到模板错误。在这种情况下,我更希望我的is_stateless 结构只是“假”(如果您提供了一个“正确”的函子和碰巧不能转换为函数指针的参数,那就是这样)。
我愿意使用 GCC4.8.* 及更低版本中的 C++11 和 c++1y 功能。关于如何做到这一点的任何想法?
【问题讨论】:
-
嗯,我想知道检查
std::decay的类型(或使用与它所做的类似的技术)是否真的可以帮助。 -
@BartekBanachewicz 不确定这会起作用 - 应该允许带有 () 运算符和 FP 转换运算符的任意类通过它。 std::decay 不会捕捉到这一点。
标签: c++ templates c++11 sfinae