【发布时间】:2019-02-22 13:43:25
【问题描述】:
cppreference/variant(4) 上的转换构造函数描述如下:
转换构造函数。构造一个变体,该变体包含替代类型
T_j,如果同时在作用域内对来自Types...的每个T_i存在虚函数F(T_i)的重载,则该变体将由表达式F(std::forward<T>(t))的重载决议选择,除了:
- 仅当声明
T_i x[] = { std::forward<T>(t) };对某些发明变量x有效时才考虑重载F(T_i);- 如果
T_i是(可能是 cv-qualified)bool,则仅当std:remove_cvref_t<T>也是bool时才考虑F(T_i)。
由于我与 Visual Studio 2010 相关联,但仍想拥有一个标准变体,因此我自己实现了一个。我遇到的问题以及我在这里寻求解决方案的问题是如何在 VS10 中实现第一个要点?如何丢弃假想函数F(T_i)如果表达式的重载
T_i x[] = { std::forward<T>(t) };
格式不正确?
在 VS15 中我可以写:
template<class T> using array_t = T[];
template<class UserType, class T_i, class = void>
struct Single_FUN_T_i {
using type = void(*)();
};
template<class UserType, class T_i>
struct Single_FUN_T_i<UserType, T_i,
decltype( array_t<T_i>{ std::declval<UserType>() }, void() )> {
// ^^ Here I check whether T_i[]{ declval<T>() } compiles
using type = T_i(*)(T_i);
};
但是在 VS10 中这不起作用,因为表达式 array_t<T_i>{ std::declval<UserType>() } 似乎不受支持(我知道别名模板也不起作用,但这不是问题)。
【问题讨论】:
标签: c++ visual-studio-2010 sfinae