模板中的C ++运行时变量

时间:2015-08-28 22:06:23

标签: c++ templates

template <int ns, int id>
class Bar
{
public:
    static int value;
};

template <int ns, int id>
int Bar<ns, id>::value = 0;

class Foo
{
public:

    template <int ns, int id>
    static int GetNextValue()
    {
        ++Bar<ns, id>::value;
        return Bar<ns, id>::value;
    }

};

class Baz
{
public:
    Baz(int value)
        : value(value)
    {
    }

    void PrintBaz();
private:
    int value;
};

在调用时可以正常工作:

Baz baz(Foo::GetNextValue<1, 1>());

我需要此代码来支持以下内容。

int ns = 1;
int id = 5;
Baz baz(Foo::GetNextValue<ns, id>());

此代码的编译无法理解。有没有办法让模板元编程支持运行时变量值?

通过任何其他方法指出解决此问题的方法也会有所帮助。

2 个答案:

答案 0 :(得分:2)

简单的答案是否定的,模板是编译时构造。如果需要可在编译时或运行时进行评估的代码,则可能需要考虑constexpr函数。

答案 1 :(得分:0)

模板元程序在编译期间“运行”。因此,中的每个输入必须在编译时才能知道。

想一想:

template<int N>
int get(void) {
  return N;
}

这为每个实例化创建了一个全新的函数,其N的值不同。因此,如果在编译时未知某些实例化的传递值,则这意味着必须在运行时生成新函数。为此,您需要将编译器作为最终应用程序的一部分。在这种情况下看起来似乎很简单,但那里有非常复杂的元程序。

此外,即使是C ++的语法也取决于某些元程序的结果:

template<bool = true>
struct switch {
  template<int>
  using thing = int;
};
template<>
struct switch<false> {
  int thing = 21;
}

switch<META>::thing<42>(21);
// bool result of comparisons: 21 < 42 > 21
// or int result from cast: 21