模板参数都是相同的类型。 [...] 这在 C++17 中可行吗?
是的,这是可能的。
但不是以如此简单的方式并且有一些缺点。
您可以编写一个接受不同类型参数的构造函数;这很简单
template <typename ... Ts>
Alfa (const Ts & ... as)
{ std::tuple<Ts...> data{as...}; }
但这允许Ts... 类型不同。
您可以使用 SFINAE 强制所有类型都相同,如下所示
template <typename T, typename ... Ts,
std::enable_if_t<(std::is_same_v<T, Ts> && ...), bool> = true>
Alfa (T const & a0, Ts const & ... as)
{
std::tuple<T, Ts...> data0{a0, as...};
std::array data1{a0, as...};
}
因此,只有在第一个 T 之后的所有 Ts... 类型与 T 完全相同时,才会启用您的构造函数
缺点:适用于
Alfa alfa{1, 2, 3, 4};
但是用
给出错误
Alfa alfa{1l, 2l, 3, 4l}; <-- 3 isn't long
因为3 可以转换为long(1l 是long)但不是long。
因此您可以检查以下Ts... 是否可以转换为T,而不是它们是否相等
template <typename T, typename ... Ts,
std::enable_if_t<(std::is_convertible_v<Ts, T> && ...), bool> = true>
Alfa (T const & a0, Ts const & ... as)
{
std::tuple<T, Ts...> data0{a0, as...};
std::array<T, sizeof...(Ts)+1u> data1{a0, as...};
}
但是这样你给T一个更大的重要性给其他类型(如果所有Ts...都可以转换为T,但如果T可以转换为Ts...之一则不行)所以我想更好的解决方案是检查是否存在通用类型
template <typename ... Ts,
typename CT = std::common_type_t<Ts...>>
Alfa (Ts const & ... as)
{
std::tuple<Ts...> data0{as...};
std::array<CT, sizeof...(Ts)> data1{as...};
}