【发布时间】:2021-04-23 12:45:31
【问题描述】:
我目前正在尝试用 C++ 创建一个 vector 类。 该类应该有一个构造函数,它接受与向量中的维度一样多的参数。在实例化向量时,维度由模板定义。 所有扩充都应该能够转换为向量起源的相同数据类型(在模板中定义)。
这是我到目前为止写的(我在这里使用了很多其他问题的sn-ps):
// this section is to create an typedef struct all_same which checks if all elements are of the same type
template<typename ...T> // head template
struct all_same : std::false_type { };
template<> // accept if no elements are present
struct all_same<> : std::true_type { };
template<typename T> // accept if only one element is present
struct all_same<T> : std::true_type { };
template<typename T, typename ...Ts> // check if first and second value are the same type and recurse
struct all_same<T, T, Ts...> : all_same<T, Ts...> { };
template<typename T, size_t N>
class vec_abs {
public:
vec_abs(const vec_abs &vec); // construct from another vector
explicit vec_abs(const std::array<T, N> &arr); // construct from array
template<typename ...Ts> requires // only compile if:
all_same<typename std::decay<Ts>::type...>::type // all are the same type (this might be optional, no sure)
&& std::conjunction<std::is_convertible<Ts, T>...>::value && // all can be converted to T
(sizeof(Ts) == N) // there are N arguments
explicit vec_abs(const Ts&&... values); // construct from multiple arguments
private:
std::array<T, N> data;
};
代码的第一部分测试所有参数是否属于同一类型,取自question。
我对这个解决方案不太确定(主要是因为它不起作用 :D),如果有任何改进建议,我将不胜感激。
感谢您的帮助!
【问题讨论】:
-
您希望它们都属于同一类型(可以转换为
T)还是都可以转换为T? -
@largest_prime_is_463035818 我希望它们可以转换为
T,我只是无法使其正常工作(哇,响应速度也很快!) -
当你说“它不起作用”时,你能不能说得更具体一些,比如例子和期望等等。
-
您在
(sizeof...(Ts) == N)中有错字,否则您发布的模板编译为:godbolt.org/z/Ys11ffqWq。也许在定义和实例化它时还有更多问题,但你没有表现出来。请包括minimal reproducible example -
你的代码有
(sizeof(Ts) == N),但你想要sizeof...操作符,那就是(sizeof...(Ts) == N)
标签: c++ templates types variadic-templates variadic