如何仅通过一种类型引用具有多种模板类型的类?

奥卢

假设我有一个Shape带有声明的类:

template <typename T, typename U, typename V>
class Shape {
   T value;
   U input;
   V input2;

   ...
}

事实上,如果我创建一个Shape对象,它的类型将类似于Shape<int, float, double>- 例如。

但是,如果我希望能够创建一个Shape对象并仍然为其提供不同类型的输入(如floatdouble),但我希望它的类型为Shape<int>.

也就是说,在创建Shape对象之后,我希望调用者只关心其值的类型,而不是其输入的类型。你建议我怎么做?

我了解到,如果没有在顶部声明模板类型,我就无法存储模板成员变量。我也尝试过使用类似的别名:

template <typename T, typename U, typename V>
using ShapeAlias<T> = Shape<T, U, V>

但这也行不通。你对我该如何解决这个问题有什么建议吗?

我正在考虑某种形式的继承,其中有一个只有一种类型的基类,而派生类包含所有三种类型,但我想我应该在这里检查一下。

编辑:我需要第二种和第三种类型,因为这个想法是用户将能够将函数传递给Shape构造函数以计算 T 的值,它可能如下所示:

auto creator = [](U a, V b){
   return (something of type T)
}

我想保留Shape类中输入类型的值。

所以从客户的角度来看,他们的代码应该是这样的:

Shape<T> shapeA(Shape<T>(uValue, vValue, creator)

就像现在一样,他们必须这样做:

Shape<T, U, V> shapeA(Shape<T, U, V>(uValue, vValue, creator))
463035818_is_not_a_number

您似乎正在寻找 CTAD(类模板参数推导)。它仅在调用者未指定任何模板参数时才有效,因此必须添加一个间接层:

template <typename T>
struct ShapeWrap {
    template <typename U,typename V>
    struct Shape {
        T value;
        U input;
        V input2;
        Shape(const U& u,const V& v) : input(u),input2(v) {}
    };
};

来电者现在可以调用:

auto s = ShapeWrap<int>::Shape(1.0,0.1f);

实例化ShapeWrap<int>::Shape<double,float>.


或者通过函数模板的模板参数推导:

template <typename T, typename U,typename V>
struct Shape {
    T value;
    U input;
    V input2;
    Shape(const U& u,const V& v) : input(u),input2(v) {}
};

template <typename T,typename U,typename V>
Shape<T,U,V> make_shape(const U& u, const V& v) {
    return {u,v};
}



int main() {
    auto s = make_shape<int>(1.0,0.1f);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有多种类型的类的模板专业化

如何专门针对一种类型的可变参数模板类?

如何在模板类中仅在一种类型的 Vector 中插入数据?

折和求和组仅适用于多种类型中的一种

C ++模板可以(仅)匹配一种类型或单个其他类型的列表吗?

一种方法允许引发多种类型的异常或仅引发一种异常会更好吗?

是否可以通过Autofac组件扫描为多种键注册一种类型?

在模板中使用第一种类型的类成员的类型

Arraylist有两种类型:如何确定第一种类型?

“'输出'仅引用一种类型,但在此处被使用为值”错误

“ ResizeObserver”仅引用一种类型,但在此处用作值

PHP映像上传-从一种类型转换为多种类型

如何创建具有相同超类的多种类型的列表,而不会丢失类型

如何创建泛型类类型作为另一种类型的子集

删除模板参数包的最后一种类型

从一种类型转换为另一种类型时的模板类型推导

是否可以从具有相同键名称但不同类型的值的另一种类型的对象创建一种类型的对象?

MySQLi仅查询一种类型的结果

@genType仅生成一种类型

仅使用一种类型的代码检索ID

从列表中仅选择一种类型

有没有一种方法可以通过Android Studio中的Ajax发送多种类型的HashMap参数?

多态变体,并将一种类型的引用绑定到另一种类型的引用

如何将一个结构转换为具有相同成员的另一种类型?

对具有两种类型的字段的Json进行反序列化,而一种类型是递归的

Rails与两种类型的用户和一种类型的表具有has_and_belongs_to_many关系

Java类,具有多种类型的Arraylist

如何在实体框架中将一种类类型的集合转换为另一种类类型的集合

类DrawerItem的一种类型参数