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>());
此代码的编译无法理解。有没有办法让模板元编程支持运行时变量值?
通过任何其他方法指出解决此问题的方法也会有所帮助。
答案 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