Как специализировать небольшую часть в большой функции шаблона во время компиляции - PullRequest
0 голосов
/ 05 ноября 2019

Проблема в следующем: у меня довольно большая функция шаблона (около 200 строк), которая должна работать очень эффективно. Однако в конкретной строке мне нужно специализировать функцию в зависимости от типа. Я не знаю, каков наилучший эффективный способ решить эту проблему. Вот несколько идей:

  1. Я, очевидно, могу использовать if (typeid(T) == typeid(some_type)), но у меня есть сомнения, что это делается во время компиляции, поскольку сравнение typeid не constexpr. Дайте мне знать, если я ошибаюсь.
  2. Я могу переместить эти строки в функцию constexpr static в классах, используемых в качестве типов шаблонов. Тем не менее, это перемещает код в место, где я не хочу, чтобы это было.
  3. Я могу продублировать 200 строк. Хорошо, давайте не будем этого делать ...

Мне не хватает лучшего способа сделать это? Как бы вы это сделали? Я использую C ++ 14.

1 Ответ

4 голосов
/ 05 ноября 2019

Я считаю, что это синтаксис, который вы ищете

/* pass parameter by reference in case you wanna change it */
inline void do_something(some_type &x/* , other parameters that any of the functions might need */)
{
    ++x; /* example, you can do anything */
}

inline void do_something(some_other_type &y/* , other parameters that any of the functions might need */)
{
    y = y * y; /* example, you can do anything */
}

template<typename T> void very_large_function(T t)
{
    // ... common code ...
    do_something(t);
    // ... more common code ...
}

, если ваши if операторы также имеют else, вы можете сделать это вместо

// final else
template<typename T>
inline void do_something(T &t) {
    t = t * 2; // example
}

inline void do_something(some_type &x)
{
    ++x; // example
}

inline void do_something(some_other_type &y)
{
    y = y * y; // example
}

template<typename T> void very_large_function(T t)
{
    // ... common code ...
    do_something(t);
    // ... more common code ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...