gpt4 book ai didi

c++ - 具有相同类型的可变参数模板参数的构造函数无法编译

转载 作者:行者123 更新时间:2023-12-01 14:48:53 34 4
gpt4 key购买 nike

我正在尝试使用可变参数模板构造函数构造一个类。
模板参数都是相同的类型。

我正在将Visual C++编译器与C++ 17一起使用,但是代码无法构建。该代码实际上使编译器崩溃。

在C++ 17中有可能吗?

 struct Alfa {
template<int... T>
Alfa(const T&... all_args) {
std::tuple<T...> data(all_args...);
}
};

Alfa alfa(1,2,3,4);

最佳答案

The template arguments are all the same type. [...] is that possible in 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...};
}

因此,只有在第一个 Ts...之后的所有 T类型都与 T完全相同时,才会启用构造函数

缺点:适用于
   Alfa alfa{1, 2, 3, 4};

但是给出了一个错误
   Alfa alfa{1l, 2l, 3, 4l};  <-- 3 isn't long

因为 3可转换为 long( 1llong)但不是 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...};
}

关于c++ - 具有相同类型的可变参数模板参数的构造函数无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856345/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com