2010-08-10 38 views
2

我不確定標題是否有意義。C++模板參數引用/值特性

讓我解釋什麼,我想做的事:

我有模板的構造函數,參數通常必須是參考,但可以在某些情況下的價值。 最後,我想有這樣的:

matrix_adapter(typename adaptable<T,A>::type); 

其中adaptable<T,A>::type可以是數值或引用防守上A型 的我不能這樣做(模板實例不會發生),和不確定爲什麼。

現在,我的解決辦法是使用SFINAE啓用/禁用的構造:

matrix_adapter(A a, typename adaptable<T,A>::pass_by_value = 0) 

然而,這需要兩個構造函數,其本質上是相同的。

是否有可能使用一個通用構造函數做到這一點?

更多的代碼:

template<typename T> 
struct adaptable<T, boost::detail::multi_array::const_sub_array<T, 2, const T*> > 
{ 
    typedef void* pass_by_value; 
    typedef boost::detail::multi_array::const_sub_array<T, 2, const T*> type; 
    static size_t size1(const type &A) { return A.shape()[0]; } 
    static size_t size2(const type &A) { return A.shape()[1]; } 
    static const T* data(const type &A) { return A.origin(); } 
}; 

template<typename T, class L = ublas::column_major> 
struct matrix_adapter 
    : ublas::matrix<T, L, ublas::array_adaptor<T> > 
{ 
    typedef ublas::array_adaptor<T> array_type; 
    typedef ublas::matrix<T, L, array_type> base; 
    matrix_adapter(size_t size1, size_t size2, T *data) 
     : base(size1, size2, array_type(size1*size2, pointer())) 
    { 
     initialize(data); 
    } 

    template<class A> 
    matrix_adapter(A a, typename adaptable<T,A>::pass_by_value = 0) 
     : base(adaptable<T,A>::size1(a), 
       adaptable<T,A>::size2(a), 
       array_type(adaptable<T,A>::size1(a)* 
          adaptable<T,A>::size2(a), 
          pointer())) 
    { 
     initialize(adaptable<T,A>::data(a)); 
    } 

    template<class A> 
    matrix_adapter(A &a) 
     : base(adaptable<T,A>::size1(a), 
       adaptable<T,A>::size2(a), 
       array_type(adaptable<T,A>::size1(a)* 
          adaptable<T,A>::size2(a), 
          pointer())) 
    { 
     initialize(adaptable<T,A>::data(a)); 
    } 
+0

你對'adaptable'的定義是什麼?第一個原因不起作用的原因是':: type'是依賴於'T'的,所以沒有什麼可以推導出'T'。 – GManNickG 2010-08-10 05:49:51

+0

@GMan @wil更多代碼發表 – Anycorn 2010-08-10 05:52:35

+0

我不知道ublas。將使用'template matrix_adapter(一個const&a):...'不適用於任何參數? – wilx 2010-08-10 07:45:01

回答

1

你的構造本身就是一個模板,但與matrix_adapter(typename adaptable<T,A>::type)簽名的編譯器不能推斷出A從呼叫類型。

通過使用SFINAE,您可以使編譯器從第一個構造函數參數中推導出A,然後第二個參數阻止在重載集中考慮其中一個或其他參數。

我不認爲有可能消除任何構造函數。