gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:48:06 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com