导出依赖类型的静态成员函数返回值的正确语法
correct syntax for deducing return value of static member function of dependent type
我不知道导出依赖类型静态成员函数返回值的正确语法。我已经尝试了十几种组合,包括使用::std::result_of,但它们似乎都不起作用。下面是看起来最有希望的变体(至少在非模板上下文中有效):
struct
t_In
{
};
struct
t_Out
{
static auto
Method(t_In &) -> t_Out
{
return(t_Out());
}
};
template<typename tp_Out, typename tp_In, typename tp_Enable = void> struct
t_Template;
template<typename tp_Out, typename tp_In> struct
t_Template
<
tp_Out
, tp_In
, typename ::std::enable_if
<
::std::is_same
<
decltype
(
::std::remove_cv // adding typename here makes Method look like type
<
typename ::std::remove_reference
<
tp_Out
>::type
>::type::Method(::std::declval<tp_In>()) // Err: does not evaluate to function ...
)
, tp_Out
>::value
>::type
>
{
};
编辑:编译VS2013,请注意,我甚至没有实例化任何东西,错误只是从这个模板单独弹出
您的问题之一是std::declval
返回一个右值引用,它不能绑定到非const左值引用,如t_In&
。
一个相当干净的解决方案是使用void_t
和std::declval<tp_In&>
:
//standard void_t implementation
template <typename...> struct voider { using type = void; };
template <typename...Ts> using void_t = typename voider<Ts...>::type;
//primary template
template<typename tp_Out, typename tp_In, typename tp_Enable = void>
struct t_Template;
//for when tp_Out has a static member function called Method
//taking an lvalue reference to tp_In
template<typename tp_Out, typename tp_In>
struct t_Template
<tp_Out, tp_In, void_t<decltype(tp_Out::Method(std::declval<tp_In&>()))>>
{
};
template<typename tp_Out, typename tp_In> struct
t_MethodReturnValueDeducer
{
typedef decltype
(
::std::remove_cv
<
typename ::std::remove_reference
<
tp_Out
>::type
>::type::Method(::std::declval<tp_In &>())
) t_Deduced;
};
template<typename tp_Out, typename tp_In, typename tp_Enable = void> struct
t_Template;
template<typename tp_Out, typename tp_In> struct
t_Template
<
tp_Out
, tp_In
, typename ::std::enable_if
<
::std::is_same
<
typename t_MethodReturnValueDeducer<tp_Out, tp_In>::t_Deduced
, tp_Out
>::value
>::type
>
{
};
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 使用新的c++返回值语法的Const方法
- C 语法,根据此代码返回值类型
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 返回值语法重载const而非const函数
- C++11-清除返回值语法和decltype关键字
- 导出依赖类型的静态成员函数返回值的正确语法