删除冗余模板类型

zim*_*rol 9 c++ templates

我目前正在努力使用模板:我有一个模板化的类A,它执行基本的数学运算(浮点数,双精度数,复数数),看起来像这样

template <typename T>
class A
{  
public:
    void foo(std::vector<std::complex<T>>& result);
};
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用类一样A<double>, A<float>,但我也想用它喜欢A<std::complex<float>>A<std::complex<double>>.当使用后者时,我希望foo看起来像这样的定义

void foo(std::vector<std::complex<float>>& result);
Run Code Online (Sandbox Code Playgroud)

而不是喜欢

void foo(std::vector<std::complex<std::complex<float>>>& result);
Run Code Online (Sandbox Code Playgroud)

有没有办法为std::complex<T>案例创建一个特定的模板,我可以在其中访问"内部"类型?或者这不可能/不好的做法?解决这个问题最优雅的方法是什么?

max*_*x66 5

另一种方法可以通过创建类型特征来检测浮点类型(在需要时提取)

template <typename T>
struct getFloatType
 { using type = T; };

template <typename T>
struct getFloatType<std::complex<T>>
 { using type = T; };
Run Code Online (Sandbox Code Playgroud)

并在A(见fT)中使用它

template <typename T>
class A
 {  
   public:
      using fT = typename getFloatType<T>::type;

      void foo(std::vector<std::complex<fT>>& result)
       { }
 };
Run Code Online (Sandbox Code Playgroud)