Почему компилятор жалуется на путь, который может быть статически исключен (см. Код ниже)? - PullRequest
1 голос
/ 03 июня 2019

Для следующего кода компилятор жалуется, что no known conversion from 'const char *' to 'int' for 1st argument. Компилятор должен знать, что t является int при вызове g. Поэтому для f("a"), g не будет вызываться.

Есть ли хороший способ справиться с этим без перегрузки шаблона?

void g(int i) {
  cout << i << endl;
}

template <typename T>
void f(T t) {
  if (is_same<T, int>::value) {
    g(t);
  }
}

int main() {
        f("a");
        return 0;
}

1 Ответ

3 голосов
/ 03 июня 2019

Устранение мертвого кода - это оптимизация , а не языковая функция.

В C ++ 17 мы получаем if constexpr, который делает то, что вы хотите. Поскольку вы пометили C ++ 11, я предполагаю, что вы не можете использовать это, и разумные опции специализируются на вашем шаблоне или отправке тегов.

Явная специализация

template <typename T>
void f(T t) { }

template <>
void f(int t) { g(t); }

Отправка тегов

namespace detail {
    template <typename T>
    f(T t, std::false_type) { }

    template <typename T>
    f(T t, std::true_type)
    {
        g(t);
    }
}

template <typename T>
f(T t) { detail::f(t, is_same<T, int>{}); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...