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));
}
你對'adaptable'的定義是什麼?第一個原因不起作用的原因是':: type'是依賴於'T'的,所以沒有什麼可以推導出'T'。 – GManNickG 2010-08-10 05:49:51
@GMan @wil更多代碼發表 – Anycorn 2010-08-10 05:52:35
我不知道ublas。將使用'template matrix_adapter(一個const&a):...'不適用於任何參數? –
wilx
2010-08-10 07:45:01