在 C++ 模板函数中使用类型特征,是否可以将值转换为相同类型的 T?
Using type traits in C++ template functions, is it possible to convert a value to a T of the same type?
我正在尝试编写这样的模板函数
template<typename T>
T doSomething() {
//Code
if (std::is_same<T, int>::value) {
return getInt(); // A library function returning an int
} else if (std::is_same<T, bool>::value) {
return getBool(); // A library function returning a bool
} else {
throw;
}
}
根据给定的模板参数调用不同的函数,returns 是一个在运行时保证与 T 具有相同类型的值。
但是,编译器给我这个错误:'return': cannot convert from 'int' to 'T'
我想我可以使用 reinterpret_cast
之类的东西,但在这种情况下这似乎是不安全和不好的做法。
那么,有没有办法根据 C++ 中的模板参数从模板函数中 return 不同的类型?
So, is there a way to return different types from a template function
depending on the template parameter in C++?
是的,你可以使用 C++17 constexpr if
template<typename T>
T doSomething() {
//Code
if constexpr (std::is_same<T, int>::value) {
return getInt(); // A library function returning an int
} else if constexpr (std::is_same<T, bool>::value) {
return getBool(); // A library function returning a bool
} else {
throw;
}
}
除了constexpr if(对于pre-c++17)你还可以使用显式特化,如下所示:
template<typename T> //primary template
T doSomething() {
std::cout<<"throw version"<<std::endl;
throw;
}
template<> //specialization for int
int doSomething<int>() {
std::cout<<"int version"<<std::endl;
return getInt();
}
template<>//specialization for bool
bool doSomething<bool>() {
std::cout<<"bool version"<<std::endl;
return getBool();
}
Demo.
我正在尝试编写这样的模板函数
template<typename T>
T doSomething() {
//Code
if (std::is_same<T, int>::value) {
return getInt(); // A library function returning an int
} else if (std::is_same<T, bool>::value) {
return getBool(); // A library function returning a bool
} else {
throw;
}
}
根据给定的模板参数调用不同的函数,returns 是一个在运行时保证与 T 具有相同类型的值。
但是,编译器给我这个错误:'return': cannot convert from 'int' to 'T'
我想我可以使用 reinterpret_cast
之类的东西,但在这种情况下这似乎是不安全和不好的做法。
那么,有没有办法根据 C++ 中的模板参数从模板函数中 return 不同的类型?
So, is there a way to return different types from a template function depending on the template parameter in C++?
是的,你可以使用 C++17 constexpr if
template<typename T>
T doSomething() {
//Code
if constexpr (std::is_same<T, int>::value) {
return getInt(); // A library function returning an int
} else if constexpr (std::is_same<T, bool>::value) {
return getBool(); // A library function returning a bool
} else {
throw;
}
}
除了constexpr if(对于pre-c++17)你还可以使用显式特化,如下所示:
template<typename T> //primary template
T doSomething() {
std::cout<<"throw version"<<std::endl;
throw;
}
template<> //specialization for int
int doSomething<int>() {
std::cout<<"int version"<<std::endl;
return getInt();
}
template<>//specialization for bool
bool doSomething<bool>() {
std::cout<<"bool version"<<std::endl;
return getBool();
}
Demo.