Специализация шаблона против использования if else в типе параметра шаблона - PullRequest
0 голосов
/ 25 июня 2018

Предположим, у нас есть шаблонная функция, в которой крошечная часть кода зависит от типа параметра шаблона.От дизайна POV (или от любого POV в этом отношении), который лучше!С помощью if else проверять тип параметра, используя type_traits (мы могли бы использовать is_same) или специализацию шаблона (мы можем поместить эту крошечную часть в другую функцию, которую мы можем специализировать)?

template <typename T>
void func(T log) {
    // common part

    // part dependent on T. We can put this in a separate function which we can specialize.
    // or we can do:
    // if (std::is_same<T, type1>::value) {
    //    //code1;
    // } else if (std::is_same<T, type2>::value) {
    //    //code2;
    // } else {
    //    //generic code;
    // }

    // common part
}

1 Ответ

0 голосов
/ 25 июня 2018

Использование времени выполнения if - плохая идея, потому что все уже известно для времени компиляции. Именно поэтому C ++ ввел constexpr if для упомянутого вами случая. constexpr if нужен компилятор, совместимый с c ++ 17, что должно быть в 2018 году: -)

template <typename T>
void func(T ) {
    std::cout << "common before" << std::endl;

     if constexpr (std::is_same<T, int>::value) {
         std::cout << "int" << std::endl;
     } else if constexpr (std::is_same<T, double>::value) {
         std::cout << "double" << std::endl;
     } else {
         std::cout << "other" << std::endl;
     }

     std::cout << "common after" << std::endl;
}

int main()
{
    func(1);
    func(1.1);
    func('a');
}

Но есть один момент, о котором вы должны упомянуть: если у вас есть большая «общая» часть в вашей шаблонной функции, не имеет значения, специализация шаблона или constexpr if, вы получаете полную копию этого кода для каждого шаблона. пример. Поэтому неплохо было бы переместить этот код в функцию, чтобы получить общую часть только один раз. Если компилятор считает, что встраивание этого кода является хорошим выбором, он сделает это, и вы получите лучшее из обоих решений.

...