对于以下代码,编译器抱怨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>{}); }