2013-02-17 53 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