C ++ 17 std::variant<class... Types>
有一个转换构造函数
template< class T >
constexpr variant(T&& t) noexcept(/* see below */);
(http://en.cppreference.com/w/cpp/utility/variant/variant中的第4位)。它的描述是一个相当难以理解的文本墙。这是否意味着表现为变体有一堆
template< class T_i > constexpr variant(T_i&& t) noexcept;
构造函数,类型中每个T_i一个?
答案 0 :(得分:5)
让我们打破说明:
如果每个
Tj
都存在虚函数F(std::forward<T>(t))
的重载,则构造一个包含替代类型F(Ti)
的变体,该变量将由表达式Ti
的重载决策选择来自Types...
同时在范围内。
假设我们在文档中有示例:
variant<string, bool> x("abc"); // OK, but chooses bool
Types...
是<string, bool>
如果来自
的每个F(Ti)
Ti
的虚函数Types...
过载
int F(string) { return 0; }
int F(bool) { return 1; }
由表达式
的重载决策选择F(std::forward<T>(t))
template <typename T>
void select(T&& t)
{
std::cout << F(std::forward<T>(t)) << '\n';
}
int main()
{
select("abc"); // prints `1`
}
构造一个包含替代类型
的变体Tj
[...]
因此,所选的替代类型Tj
为bool
。