C ++模板参数引用/值特征

时间:2010-08-10 05:37:01

标签: c++ templates

我不确定标题是否有意义。

让我解释一下我想做什么:

我有模板构造函数,参数一般必须是引用,但在某些情况下可以是值。 最终,我希望有类似的东西:

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));
    }

1 个答案:

答案 0 :(得分:1)

您的构造函数本身就是一个模板,但签名为matrix_adapter(typename adaptable<T,A>::type)时,编译器无法从调用中推断出A的类型。

通过使用SFINAE,您可以使编译器从第一个构造函数参数中推导出A,然后第二个参数阻止在重载集中考虑一个或另一个。

我不相信有可能消除这两种构造函数。