C++11 为什么编译器抱怨可以静态排除的路径(参见下面的代码)?
对于以下代码,编译器抱怨C++11 为什么编译器抱怨可以静态排除的路径(参见下面的代码)?,c++11,templates,C++11,Templates,对于以下代码,编译器抱怨没有已知的第一个参数从“const char*”到“int”的转换。编译器在调用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);
没有已知的第一个参数从“const char*”到“int”的转换。编译器在调用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;
}
void g(int i){
cout消除死代码是一种优化,而不是一种语言功能
在C++17中,如果constexpr
满足您的要求,我们将得到。因为您已经标记了C++11,我假设您不能使用它,明智的选择是专门化您的模板或标记分派
显性专业化
template <typename T>
void f(T t) { }
template <>
void f(int t) { g(t); }
模板
空f(T){}
模板
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>{}); }
名称空间详细信息{
模板
f(T,std::false_type){
模板
f(T,标准::真实类型)
{
g(t);
}
}
模板
f(T T){细节::f(T,是{})}