[英]Templated class: Check if complex at compile time
我有一個帶有Scalar
A
類模板,它可以是實數值或復數值。 它有一個realPart
方法,該方法應該返回數字的實部。 如果Scalar
是實值,則應該只返回原始Scalar,如果復雜類型則返回.real()
。
寫作時
#include <complex>
#include <iostream>
template<class Scalar>
class A {
public:
A (const Scalar z):
z_(z)
{
}
Scalar realPart()
{
return z_.real();
}
private:
Scalar z_;
};
int main() {
A<std::complex<double>> z0((1.0, 2.0));
std::cout << z0.realPart() << std::endl; // check
A<double> z1(1.0);
std::cout << z1.realPart() << std::endl; // mööp
}
編譯器會在z1.realPart()
抱怨,因為double
不知道.real()
。
如何在編譯時保護.real()
?
這可以通過簡單的is_complex
特征和SFINAE來完成:
template<class T> struct is_complex : std::false_type {};
template<class T> struct is_complex<std::complex<T>> : std::true_type {};
template<class Scalar>
class A {
public:
A(const Scalar z) : z_(z)
{ }
template<class S = Scalar, std::enable_if_t<is_complex<S>{}>* = nullptr>
Scalar realPart()
{
return z_.real();
}
template<class S = Scalar, std::enable_if_t<!is_complex<S>{}>* = nullptr>
Scalar realPart()
{
return z_;
}
private:
Scalar z_;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.