2016-12-01 2 views
0

Я смущен о расширении этого шаблона [пример один]. Если bool b проверяется во время выполнения в конструкторе, где хранится b? он помещается в секцию частных данных [пример два]? или он становится временем компиляции и удаляет разветвленную на основе bool? или это просто "вставить", что было принято в качестве аргумента шаблона в, если (б) [пример 3]Как расширяются аргументы шаблона

Пример один:

template<bool b> 
    class Test 
    { 
    public: 
     Test() 
     { 
      if(b) 
      { 
       // do something 
      } 
      else 
      { 
       // do something else 
      } 
     } 
    }; 

Пример два:

class Test 
{ 
public: 
    Test() 
    { 
     if(b) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    } 

private: 
    bool b = true; 
}; 

примера три :

//called with Test<true> 

class Test 
{ 
public: 
    Test() 
    { 
     if(true) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else - probably removed due too compiler optimization 
     } 
    } 
}; 

ответ

2

Пример 3 - это фрагмент, который более точно напоминает то, что делает компилятор. Важно понимать, что в примере 2 неверно, поскольку параметр шаблона оценивается во время компиляции и не вводится в класс как поле.

Doing if(b){ } else { } где b является параметром шаблона bool потребует обе ветви if заявление, чтобы быть как распознаваем и хорошо сформированные, даже если компилятор будет очень вероятно, оптимизировать из сук, который не соответствует b.


Если вы хотите гарантированную оценку филиальную время компиляции, и если вам нужно только взятой отрасли, чтобы быть хорошо сформированные, вы можете использовать if constexpr(...) в C++ 17:

if constexpr(b) 
{ 
    // do something 
} 
else 
{ 
    // do something else 
} 

... или реализовать свою собственную конструкцию static_if в C++ 14 ...

... или используйте explicit template specialization на C++ 11.

Я охватываю все эти техники в своем разговоре CppCon 2016, "Implementing static control flow in C++14".

0

он помещается в раздел частных данных [exampl e two]?

Ну, нет. Вы можете так думать об этом, потому что в принципе b доступен только в Test, но на самом деле это не частный член, это параметр шаблона.

ли это время компиляции и удалить разветвленную на основе bool?

Хороший компилятор, вероятно, оптимизирует ветвь, да, поскольку результат ветвления известен во время компиляции. Но вы не можете быть уверены.

Смежные вопросы