我又卡住了……
我有这个模板类:
template <typename a,typename b,typename c>
class myclass
{...};
我想声明这个类的一个对象:
myclass<a,b,c> x;
这显然不起作用,我似乎无法弄清楚如何声明这个对象,或者它是否可能。
我可以制作这样的对象:
myclass<int,double,int> x;
但我不想指定 a、b、c 的类型。
我又卡住了……
我有这个模板类:
template <typename a,typename b,typename c>
class myclass
{...};
我想声明这个类的一个对象:
myclass<a,b,c> x;
这显然不起作用,我似乎无法弄清楚如何声明这个对象,或者它是否可能。
我可以制作这样的对象:
myclass<int,double,int> x;
但我不想指定 a、b、c 的类型。
在不拼写参数的情况下制作复杂模板实例的典型方法是使用类型推导函数模板:
template <typename A, typename B, typename C>
myclass<A, B, C> make_myclass(A a, B b, C C)
{
return myclass<A, B, C>(); // or whatever
}
用法:
auto x = make_myclass(1, 'x', -2.5f); // x is a myclass<int, char, float>
标准库中使用此习惯用法的典型示例是make_shared
、make_unique
、make_pair
、make_tuple
和。make_exception_ptr
make_optional
如果我理解正确,您需要在模板函数或类中声明它。
template <typename a,typename b,typename c>
void F(){
myclass<a,b,c> x;
...
}
否则,它会被 C++ 和逻辑禁止。
c++ 中没有类型无关的对象,每个对象在声明时都需要类型化。实现类型擦除的唯一方法是使用诸如void*
指针转换之类的技术,您可以从boost type erasure中找到