Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接受N个参数转换为同一类型 我现在试图在C++中生成一个向量类。 这个类应该有一个构造函数,它接受的参数和向量中的维数一样多。在实例化向量时,维度由模板定义。 所有的增广都应该能够转换为向量来源的相同数据类型(在模板to中定义)_C++_Templates_Types_Variadic Templates_Variadic - Fatal编程技术网

接受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;
};