У меня есть класс с аргументом логического шаблона.
template<bool b>
class Foo {
void doFoo();
};
Я хочу, чтобы doFoo
делал разные вещи, основываясь на значении b
.
Наивно я мог написать
Опция 1
template<bool b> void Foo<b>::doFoo() {
if (b) cout << "hello";
else cout << "goodbye";
}
Это кажется мне неэффективным, потому что я должен выполнить if
каждый раз функция называется событием, хотя правильная ветка должна быть известна во время компиляции. Я мог бы исправить это с помощью специализации шаблона:
Вариант 2
template<> void Foo<true>::doFoo() { cout << "hello"; }
template<> void Foo<false>::doFoo() { cout << "goodbye"; }
Таким образом, у меня нет каких-либо условностей, выполняемых во время выполнения. Это решение немного сложнее (тем более, что в моем реальном коде класс имеет несколько аргументов шаблона, и вы не можете частично специализировать функции, поэтому мне нужно будет обернуть функцию в классе).
Мой вопрос заключается в том, что компилятор достаточно умен, чтобы знать, что он не выполняет условие в варианте 1, поскольку он всегда выполняется одинаково или мне нужно написать специализации? Если компилятор достаточно умен, я был бы рад узнать, зависит ли это от компилятора или от языковой функции, на которую я могу положиться?