2017-08-25 78 views
4

這是我的問題:專營C++類的成員函數對於模板類

我有一個CC級,我想專注一類的成員方法對於另一個模板類(模板參數)。 一個例子:

#include <iostream> 
#include <string> 
#include <complex> 

template<class T> 
class cc { 
    public: 

    void foo() ; 

    T v ; 
}; 

template<class T> // OK, generic definition of foo() 
void cc<T>::foo() { 
    std::cout << v << std::endl ; 
} 

//////////////////////////////////////////////////////////////////// 
// ERROR! can not accept the the specialization respect to a 
// complex<TT> with a template argument. 
template<class TT> 
void cc< std::complex<TT> >::foo() { 
    std::cout << "complex t " << v << std::endl ; 
} 
//////////////////////////////////////////////////////////////////// 


template<> // OK! specialization respect to a complex<double> 
void cc< std::complex<double> >::foo() { 
    std::cout << "complex " << v << std::endl ; 
} 


template<> // OK! 
void cc<double>::foo() { 
    std::cout << "double: " << v << std::endl ; 
} 

int main() 
{ 
    cc< std::complex<double> > r ; 
    cc<double> r2 ; 

    r.foo() ; 
    r2.foo() ; 
} 

在C++中是複雜的模板類型,所以想要寫的成員函數,與每一個複雜<類型>其中類型是任何模板類型的作品。 有可能嗎?

+0

模板功能部分專業化是不允許的。 – bolov

回答

4

可以部分專門全班:

template<class T> 
class cc { 
public: 

    void foo() { std::cout << v << std::endl ; } 

    T v ; 
}; 

template <class T> 
class cc<std::complex<T>> { 
    public: 

    void foo() { std::cout << "complex " << v << std::endl ; } 

    std::complex<T> v ; 
}; 

或委託通用的方法來一個「幫手」(我展示了使用重載的):

template <typename T> 
void print(const T&v) { std::cout << v << std::endl ;} 

template <typename T> 
void print(const std::complex<T>& c) { std::cout << "complex " << c << std::endl; } 

template<class T> 
class cc { 
public: 
    void foo() { print(v); } 

    T v ; 
}; 
+0

Tnx!我的(真實)案例中的代表團可能是最好的解決方案。 – Giggi

1

這裏是一個解決方案,它使用SFINAE。如果需要,謂詞is_complex可以作爲類cc的嵌套類型。在C++ 14中,std::enable_if語法稍微好一些。這裏有雲(online):

委派

answer通過Jarod42,我們可以實現print功能像這樣的模板成員函數(online)的啓發:

template<class T> 
class cc { 
    template <typename TT> 
    void print(const TT&v) { std::cout << v << std::endl ;} 

    template <typename TT> 
    void print(const std::complex<TT>& c) { std::cout << "complex " << c << std::endl; } 

public: 
    void foo() { print(v); } 

    T v ; 
}; 
+0

請注意,在您的SFINAE實現中,我們可以欺騙並調用cc().foo >()'。 – Jarod42

+0

@ Jarod42確實如此,但通過在'enable_if'參數中添加'and std :: is_same :: value',可以輕鬆解決問題。 – Jonas