c++ - 如果模板参数复杂,则在模板函数中应用std::conj

标签 c++ c++11 complex-numbers

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/

相关文章:

c++ - 如何更改宏函数参数扩展顺序?

python - 如何在 3D 绘图中缩放和设置 RGB 正交轴

c++ - 如何在 Eigen 库中手动构建复杂矩阵?

c++ - C++ STL 中 vector 的恒定时间交换逻辑

c++ - 这种转换 Unicode 字符的方法是否真的不可知字节序?

c - 将复数乘以标量,例如 (2-6i)*3

c++ - 如何记录 Doxygen 中的重载函数?

c++ - C++ While语句不适用于字符串和 “or”

c++ - boost::make_shared<string>() 与 boost::make_shared<string>(string (""))

c++ - GCC 4.4 不实现 C++11 范围循环。它支持哪些其他范围循环语法?