2013-02-17 89 views
1

给定一个任意的数字类型,这可能是也可能不是一个std::complex类型,我想获得代表该类型“真实部分”的类型。例如,std::complex<double>的实数部分是doubledouble的实数部分是double本身。下面的例子使用C++部分模板特化来实现这一点。 @mfontanini发布了一个更简单的方法。如何确定任意C++数值类型的实部类型?

我的问题:是否有直接的方式来做到这一点已经在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; 

回答

3

有没有必要使用类型特质,你也能完成同样只使用模板特:

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

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

这是否已经某处升压实现,我真的不知道。

+0

感谢您的注意! – 2013-02-17 20:21:23