声明不带参数的模板

Declare template without parameters

本文关键字:参数 声明      更新时间:2023-10-16

是否可以声明一个没有参数的模板?

我有一个模板,像:

template < int i, int j>
class X{
     int  doSomething() { return i+j;}
}

,现在我想在另一个类中使用这个模板,但我不知道它的参数,因为它们是可变的。但是我想把不同的模板保存在一个变量中,像这样:

class Foo {
X        var;
void setVar ( const X &newVar) { var = newVar;  }
X    getVar () { return var;}
}

是否有办法在一个变量中保存不同类型的模板?还是指针?

谢谢你的帮助

模板在编译时解析;模板参数不能依赖于运行时才知道的值。此外,每个模板实例都是不同的类型:X<1, 2>X<3, 4>是不同的,就像FooBar是不同的两个类一样;一种类型的变量不能保存另一种类型的值。你不能有一个只有X类型的变量,因为X不是一个类型(它是一个模板)。

模板没有形参是没有意义的;在这种情况下,您根本不需要模板。不清楚为什么要尝试使用模板来添加两个变量。您可能只想使用一个类来保存传递给其构造函数的两个整数:

class X {
private:
    int i, j;
public:
    X(int i, int j): i(i), j(j) { }
    int doSomething() const { return i + j; }
};

这将允许您拥有类型为X的变量,并且您可以在运行时基于变量为ij构造具有不同值的X的不同实例。

您可能希望使用类型擦除。boost::any提供了一个很好的实现,可能足以满足您的用例。以下是根据您的情况修改的示例:

BOOST_TYPE_ERASURE_MEMBER((canDoSomething), doSomething, 0)
class Foo {
using X = any<canDoSomething<int(void)>>;
X        var;
void setVar ( const X &newVar) { var = newVar;  }
X    getVar () { return var;}
int DoSomethingWithX() { return var.doSomething();}
}