簡體   English   中英

模板化類:檢查編譯時是否復雜

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM