是否可以创建一个模板元构造,它可以在第一次(或第一次 n 次)被调用时采用一个执行路径,如果它被多次调用(超过 n 次),则可以采用另一个执行路径?
问问题
472 次
4 回答
2
不会。模板仅在编译时进行评估。
问题是关于运行时发生的事情(执行路径)。
现在应该很有可能在代码中构建这个结构,但它不是模板元结构(虽然它可以是模板元程序的一部分,但进行测试的代码将是运行时代码(即普通代码) ))。
于 2012-09-18T06:07:55.877 回答
2
使用模板可以实现的是路径的编译时间决策,就像在这个例子中使用模板专业化:
template <bool whichOne>
class ExecutionExampleImpl;
template <>
class ExecutionExampleImpl<true> {
public:
static void doIt() {
std::cout << "Do it for the first time(s)\n";
}
};
template <>
class ExecutionExampleImpl<false> {
public:
static void doIt() {
std::cout << "Do it for the second time(s)\n";
}
};
template <unsigned execution>
void executionExample()
{
const unsigned ExecutionExampleFirstLimit = 3;
ExecutionExampleImpl<execution <= ExecutionExampleFirstLimit>::doIt();
}
int main() {
executionExample<1>();
executionExample<2>();
executionExample<3>();
executionExample<4>();
executionExample<5>();
executionExample<6>();
}
但是,我相信您会更喜欢运行时决策。您可以使用静态局部变量进行此操作:
void executionExample()
{
const unsigned ExecutionExampleFirstLimit = 3;
static unsigned executionCounter = 0;
if (executionCounter++ < ExecutionExampleFirstLimit)
{
std::cout << "Do it for the first time(s)\n";
}
else
{
std::cout << "Do it for the second time(s)\n";
}
}
int main() {
for (unsigned int i = 0; i < 6; ++i)
executionExample();
}
于 2012-09-18T07:01:07.323 回答
1
该问题与两个明显不相关的事物相匹配:模板由编译器实例化(不执行),所需的实例由机器(而不是编译器)在运行时执行。
您可以做的是制作一个模板,根据常量值进行不同的实例化。如果这些实例是递归的,那么您就有一种“编译时执行”来决定要实例化什么。
std::conditional可以是一个很好的示例。
于 2012-09-18T07:02:52.210 回答
0
在一般情况下,是否遵循特定路径以及遵循多少次,可以在运行时决定——如果函数调用在if
语句体中,举一个明显的例子。然而,任何依赖于模板(及其参数)的指令执行流程的构造都必须在编译时知道这一点。所以不,它不能完成。
于 2012-09-18T06:08:28.370 回答