我不确定标题是否有意义。
让我解释一下我想做什么:
我有模板构造函数,参数一般必须是引用,但在某些情况下可以是值。 最终,我希望有类似的东西:
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 :(得分:1)
您的构造函数本身就是一个模板,但签名为matrix_adapter(typename adaptable<T,A>::type)
时,编译器无法从调用中推断出A
的类型。
通过使用SFINAE,您可以使编译器从第一个构造函数参数中推导出A
,然后第二个参数阻止在重载集中考虑一个或另一个。
我不相信有可能消除这两种构造函数。