1

给定一个可能是也可能不是类型的任意数字类型std::complex,我想获得代表该类型“真实部分”的类型。例如, is 的实部, std::complex<double>is的实double部。下面的示例使用 C++ 部分模板特化来完成此操作。@mfontanini 在下面发布了一个更简单的方法。doubledouble

我的问题:Boost 库中是否有直接的方法可以做到这一点?如果是这样,我一直找不到它。

#include <complex>
#include <boost/type_traits/is_complex.hpp>

template <typename T>
class RealPart
{
private:
    template <bool, typename>
    class ResultType;

    // complex type -> real type
    template <typename T1>
    class ResultType<true, T1>
    {
    public:
        typedef typename T1::value_type type;
    };

    // real type -> real type
    template <typename T1>
    class ResultType<false, T1>
    {
    public:
        typedef T1 type;
    };

public:
    // define result_type, making use of the template specialization above
    typedef typename ResultType<boost::is_complex<T>::value, T>::type result_type;
};


// both will become doubles
RealPart<std::complex<double> > a;
RealPart<double> b;
4

2 回答 2

3

不需要使用类型特征,您可以仅使用模板特化来完成相同的操作:

// general case
template <typename T>
struct RealPart {
    typedef T type;
};

// std::complex
template <typename T>
struct RealPart<std::complex<T> > {
    typedef T type;
};

这是否已经在 boost 中的某个地方实现了,我真的不知道。

于 2013-02-17T20:17:03.437 回答
1

这在编译时有效:

// arr has type std::complex<T>
using RealType = decltype((*arr).real());

// or even
using RealType = decltype((U {}).real()); // U is std::complex<T>
于 2021-07-07T04:34:16.170 回答