为什么编译器抱怨可以静态排除的路径(见下面的代码)



对于以下代码,编译器抱怨no known conversion from 'const char *' to 'int' for 1st argument .编译器在调用g时应该知道t是一个int。因此对于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;
}

消除死代码是一种优化,而不是语言功能。

在 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>{}); }

最新更新