编译时单例多于一次实例化检测

时间:2012-09-18 05:59:52

标签: c++ templates c++11

是否可以创建一个模板元结构,它可以在第一次(或前n次)调用它时执行一个执行路径,如果多次调用多次执行路径(多次n次),可以使用另一个执行路径?

4 个答案:

答案 0 :(得分:2)

没有。模板仅在编译时进行评估。

问题是关于在运行时发生的事情(执行路径) 现在应该很有可能在代码中构建这个构造,但它不是模板元构造(虽然它可以是模板元程序的一部分,但是进行测试的代码将是运行时代码(即普通代码) ))。

答案 1 :(得分:1)

使用模板可以实现的是路径的编译时决定,就像在此示例中使用模板专门化一样:

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

答案 2 :(得分:1)

该问题与两个非常不相关的事情相匹配:编译器模板实例化(不是执行),运行时所需的实例 excecuted -time由机器(而不是编译器)。

您可以做的是制作一个模板,根据常量值进行不同的实例化。如果这些实例是递归的,那么你有一种“编译时执行”来决定实例化的内容。

std::conditional可以是一个很好的样本。

答案 3 :(得分:0)

在一般情况下,是否遵循特定路径,以及可以在运行时决定多少次 - 如果函数调用在if语句的主体中,则采用一个明显的例子。但是,任何依赖于模板(及其参数)的执行流程的构造都必须在编译时知道这一点。所以不,它无法完成。