是否可以声明没有参数的模板?
我有一个模板:
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;}
}
有没有办法在一个变量中保存不同类型的模板?还是指针?
寻求帮助
答案 0 :(得分:5)
模板在编译时解析;您的模板参数不依赖于在运行时之前不知道的值。此外,模板的每个实例都是不同的类型:X<1, 2>
和X<3, 4>
不同,就像两个类Foo
和Bar
不同;一种类型的变量不能保持另一种的变量。您不能拥有类型仅为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
类型的变量,并且您可以根据运行时的变量为X
和i
构建具有不同值的j
的不同实例。
答案 1 :(得分:0)
您可能希望使用类型擦除。 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();}
}