假设我有一个Shape
带有声明的类:
template <typename T, typename U, typename V>
class Shape {
T value;
U input;
V input2;
...
}
事实上,如果我创建一个Shape
对象,它的类型将类似于Shape<int, float, double>
- 例如。
但是,如果我希望能够创建一个Shape
对象并仍然为其提供不同类型的输入(如float
和double
),但我希望它的类型为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))
您似乎正在寻找 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] 删除。
我来说两句