首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确保模板参数类型与其可变构造函数的类型相匹配

确保模板参数类型与其可变构造函数的类型相匹配
EN

Stack Overflow用户
提问于 2019-05-26 14:35:22
回答 3查看 78关注 0票数 2

我希望有一个这样的类:

template<typename T>
struct Foo {
    T* data_;

    template<typename... Ts, std::enable_if<std::is_same<T,Ts>...>...>
    explicit Foo(Ts...ts) : data_{ ts... } {}
};

但是,语法有问题,我不确定在初始化时是否可以像这样直接将参数设置到指针中。

我想要做的很简单:

Foo<int> f1{ 1, 3, 5, 7 }; // Or
// Foo<int> f1( 1, 3, 5 7 );
// f1.data_[0] = 1
// f1.data_[1] = 3
// f1.data_[2] = 5
// f1.data_[3] = 7
// f1.data_[4] = ... not our memory either garbage or undefined...

Foo<float> f2{ 3.5f, 7.2f, 9.8f }; // Or
// Foo<float> f2( 3.5f, 7.2f, 9.8f );
// f2.data_[0] = 3.5
// f2.data_[1] = 7.2
// f2.data_[2] = 9.8
// f2.data_[3] = ... not our memory

我还希望让构造函数进行检查,以确保传递给构造函数的每个参数都是<T>类型;简单地说,对于每个Ts,它必须是一个T

我可能想得太多了,但对于我来说,我不能得到这个或类似的东西来编译。我不知道它是在enable_ifis_same中,还是通过类的初始化器列表并试图将内容存储到指针中。我不知道是否应该使用T数组,但是在将参数传递到构造函数之前,数组的大小是未知的。我还试图在不使用std::vector等基本容器的情况下实现这一点;它更多的是为了自我教育,而不是为了实用的源代码。我只想看看如何使用原始指针来实现这一点。

编辑

我已经将我的类改为如下所示:

template<typename T>
struct Foo {
    T* data_;

    template<typename... Ts, std::enable_if_t<std::is_same<T, Ts...>::value>* = nullptr>
    explicit Foo( const Ts&&... ts ) : data_{ std::move(ts)... } {}
 };

在尝试使用它时:

 int a = 1, b = 3, c = 5, d = 7;
 Foo<int> f1( a, b, c, d );
 Foo<int> f2{ a, b, c, d };

我在这个迭代中比较接近;但是它们都给出了不同的编译器错误。

  • 第一个是:C2661:“没有重载函数采用4 arguments"
  • And第二个:C2440:”正在初始化,无法从初始化器列表转换为容器,没有构造函数可以采用源类型,或者构造函数重载解析不明确。“
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56311239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档