TL; DR 假设我有一个带有模板参数T
的函数,该函数以std::vector<T>&
作为输入(请参见下文),如果T
是复杂类型,我想对这个 vector 进行共轭。我怎样才能做到这一点 ?
我尝试了什么在https://stackoverflow.com/a/30737105/5913047之后,我知道我可以检查类型是否复杂
template<class T> struct is_complex : std::false_type {};
template<class T> struct is_complex<std::complex<T>> : std::true_type {};
所以我尝试了:template<typename T>
void MyFunction(std::vector<T>& MyVector){
// do something
if (is_complex<T>()){
std::transform(MyVector.begin(), MyVector.end(), MyVector.begin(),[](T&c){return std::conj(c););
}
}
但是,如果我将此函数用于非复杂类型,则编译器会说未为非复杂类型定义conj
。有一些设计可以做我想要的吗?
最佳答案
您正在使用if
语句。这要求if
分支中的代码是可编译的,即使您不需要执行该代码。
在c++ 17中,要有条件地编译一段代码,可以这样使用if constexpr
:
if constexpr (is_complex<T>()) {
//^^^^^^^^^
std::transform(MyVector.begin(), MyVector.end(), MyVector.begin(),[](T&c){ return std::conj(c); });
}
这是demo。在c++ 11中,对于类型非复杂的情况,可以使用
std::enable_if
编写重载,如下所示:template<typename T, typename std::enable_if<!is_complex<T>::value, int>::type = 0>
void MyFunction(std::vector<T>& MyVector){
// do something
}
template<typename T, typename std::enable_if<is_complex<T>::value, int>::type = 0>
void MyFunction(std::vector<T>& MyVector){
// do something
std::transform(MyVector.begin(), MyVector.end(), MyVector.begin(),[](T&c){ return std::conj(c); });
}
这是一个demo。
关于c++ - 如果模板参数复杂,则在模板函数中应用std::conj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63316242/