声明没有参数的模板

时间:2014-07-16 15:17:04

标签: c++ templates

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

我有一个模板:

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;}
}

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

寻求帮助

2 个答案:

答案 0 :(得分:5)

模板在编译时解析;您的模板参数不依赖于在运行时之前不知道的值。此外,模板的每个实例都是不同的类型: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类型的变量,并且您可以根据运行时的变量为Xi构建具有不同值的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();}
}