【发布时间】:2014-06-15 19:52:03
【问题描述】:
std::result_of 在编译时计算调用表达式的返回类型。
正如the reference 所说,如果调用格式错误,std::result_of 的实例化会导致编译错误。但是假设我们需要在获取结果类型之前检查调用是否格式正确。
有没有办法编写一个特征来检查调用表达式是否格式正确?
类似:
template<typename F , typename... ARGS>
struct is_valid_call : public impl::is_valid_call<F,typelist<ARGS...>>
{};
namespace impl
{
struct sfinae_result{};
template<typename F , typename ARGS , typename ENABLED = sfinae_result>
struct is_valid_call;
template<typename F , typename... ARGS>
struct is_valid_call<F,typelist<ARGS...>,
decltype( std::declval<F>()(std::declval<ARGS>()...) )
> :
public std::true_type
{};
template<typename F , typename... ARGS>
struct is_valid_call<F,typelist<ARGS...>,sfinae_result> :
public std::false_type
{};
}
编辑:当然是doesn't work
发布的解决方案【问题讨论】:
-
@jrok 当然,对于真正的实现,我应该处理函数指针、仿函数和 lambda。但是假设这只是函子,以简化问题(解决方案是相同的,不是吗?只有更多的情况)。我的意图是在 SFINAE 上下文中使用这种特征,特别是(例如)检查给定的转换函数是否适用于特定类型。
标签: c++ c++11 sfinae typetraits