接受N个参数转换为同一类型 我现在试图在C++中生成一个向量类。 这个类应该有一个构造函数,它接受的参数和向量中的维数一样多。在实例化向量时,维度由模板定义。 所有的增广都应该能够转换为向量来源的相同数据类型(在模板to中定义)
这是我到目前为止所写的(我在这里使用了许多其他问题的片段):接受N个参数转换为同一类型 我现在试图在C++中生成一个向量类。 这个类应该有一个构造函数,它接受的参数和向量中的维数一样多。在实例化向量时,维度由模板定义。 所有的增广都应该能够转换为向量来源的相同数据类型(在模板to中定义),c++,templates,types,variadic-templates,variadic,C++,Templates,Types,Variadic Templates,Variadic,这是我到目前为止所写的(我在这里使用了许多其他问题的片段): //本节将创建一个typedef struct all\u same,用于检查所有元素是否属于同一类型 模板//头部模板 struct all_same:std::false_type{}; 模板//如果不存在元素,则接受 struct all_same:std::true_type{}; 模板//仅存在一个元素时接受 struct all_same:std::true_type{}; 模板//检查第一个值和第二个值是否为同一类型并递
//本节将创建一个typedef struct all\u same,用于检查所有元素是否属于同一类型
模板//头部模板
struct all_same:std::false_type{};
模板//如果不存在元素,则接受
struct all_same:std::true_type{};
模板//仅存在一个元素时接受
struct all_same:std::true_type{};
模板//检查第一个值和第二个值是否为同一类型并递归
struct all_same:all_same{};
模板
类车辆abs{
公众:
vec_abs(const-vec_abs&vec);//从另一个向量构造
显式vec_abs(const std::array&arr);//从数组构造
只有在以下情况下,模板才需要//编译:
all_same::type//所有都是相同的类型(这可能是可选的,不确定)
&&std::conjunction::value&&//all可以转换为T
(sizeof(Ts)==N)//有N个参数
显式vec_abs(const Ts&&…value);//从多个参数构造
私人:
std::数组数据;
};
代码的第一部分测试是否所有参数都属于同一类型,取自此
我对这个解决方案很不确定(主要是因为它不起作用:D),如果有任何改进建议,我将不胜感激
谢谢你的帮助 递归模板非常昂贵(就编译时间和编译器内存使用而言),因此,当它们工作时,而且在历史上是执行某些解决方案的唯一方法,现在可以使用更简洁、编译速度更快的现代技术 您可以使用折叠表达式用简单的constexpr函数替换整个all_-same:
template <typename T, typename... Ts>
constexpr bool all_same() {
return (std::is_same_v<T, Ts> && ...);
}
static_assert( all_same<int, int, int>() );
模板
constexpr bool all__same(){
返回(标准::是否相同?&&;
}
静态断言(全部相同());
但是,既然它们都必须转换为T,为什么还要确保它们是完全相同的类型?这似乎是不必要的限制。您可以使用
std::is\u convertible\u v
轻松地将上述函数更改为“all\u convertible\u to”。如果您不希望所有参数都是同一类型的,可以删除该部分。除此之外,这里还有一个输入错误:
(sizeof(Ts) == N)
应该是
(sizeof...(Ts) == N)
在修复该问题、转发参数并添加构造函数的定义之后,您的代码似乎可以执行您想要的操作:
#include <type_traits>
#include <array>
#include <iostream>
template<typename T, size_t N>
struct vec_abs {
template<typename ...Ts> requires // only compile if:
std::conjunction<std::is_convertible<Ts, T>...>::value && // all can be converted to T
(sizeof...(Ts) == N) // there are N arguments
explicit vec_abs(Ts&&... values) : data({std::forward<Ts>(values)...}) {}
std::array<T, N> data;
};
int main() {
auto foo = vec_abs<int,3>(1,2,3);
foo = vec_abs<int,3>(1.0,2,3);
for (const auto& e : foo.data) std::cout << e;
auto bar = vec_abs<std::string,3>("foo",std::string{"bar"},"moo");
for (const auto& e : bar.data) std::cout << e;
// bar = vec_abs<std::string,3>(123,1.2); // error wrong number
//bar = vec_abs<std::string,3>(123,1.2,42); // error cannot be converted
}
如果您确实希望所有参数都是同一类型的约束
正如另一个答案所提到的,您的中的递归是可以避免的。以下内容已在C++11中运行。不幸的是,我再也找不到原始来源了
template <typename T,typename...Ts>
struct all_same {
static const bool value = std::is_same< all_same, all_same<Ts...,T>>::value;
};
模板
结构都一样{
静态常量布尔值=std::is_same::值;
};
你希望它们都是同一类型的(可以转换成T
)还是都可以转换成T
?@maximust_prime_是_463035818我更希望它们可以转换成T
,当你说“它不起作用”时,我只是无法让它们工作(哇,反应很快!)你可以更具体一些,举例说明和期望值等。你在(sizeof…(Ts)==N)
中有一个输入错误,否则你发布的模板将编译:。在定义和实例化时,可能会有更多的问题,但您没有说明这一点。请包括您的代码有(sizeof(Ts)==N)
但您需要sizeof…
操作员,这是(sizeof…(Ts)==N)
首先,感谢您的帮助和快速响应!我更喜欢使用std::is\u convertible\u v
,元素不必是相同的类型。
123foobarmoo
template <typename T,typename...Ts>
struct all_same {
static const bool value = std::is_same< all_same, all_same<Ts...,T>>::value;
};