是否可以指定模板类的两个部分? (部分之前'<'以及'<>')

时间:2014-06-19 06:15:09

标签: c++ templates

class trytemplate
{
public:
    //////// 1
    template <typename T>
    trytemplate(const T& p)
    {
        std::cout << p << std::endl;
    }

    //////// 2
    template <typename U>
    trytemplate(const std::vector<U>& p)
    {
        std::cout << p[0] << " " << p.size() << std::endl;
    }

    //////// 3
    template <typename U, typename V>
    trytemplate(const V<U>& p)
    {
        std::cout << p[0] << " " << p.size() << std::endl;
    }
};

ctor 2工作正常,但我想使它像3(3不编译)。
所以我可以做类似的事情:

int i = 123;
trytemplate o1(i); // call ctor 1

std::vector<float> v1(1, 123.0f);
trytemplate o2(v1); // ideally can be deduced by compiler, and call ctor 3

MyVector<float> v2(1, 123.0f);
trytemplate o3(v2); // ideally can be deduced by compiler, and call ctor 3

在这种情况下,我可以传入任何类似矢量的容器,只需确保该类具有operator[]size()

所以问题是:是否有可能像3号那样使用ctor? 或者有更好的方法吗?

P.S。如果有人能提出更好的头衔,那么我会改变它,谢谢!

1 个答案:

答案 0 :(得分:4)

使用模板模板参数

template <template<typename> class V, typename U>
trytemplate(const V<U>& p)
{
    std::cout << p[0] << " " << p.size() << std::endl;
}

您还可以添加可变参数模板以接受带有多个模板参数的类模板。

template <template<typename...> class V, typename... Params>
trytemplate(const V<Params...>& p)
{
    std::cout << p[0] << " " << p.size() << std::endl;
}

请注意,如果使用非可变参数(第一个)版本,则传入的类模板应该只接受一个模板参数。这意味着它不能与std::vector一起使用,因为它需要第二个模板参数,即分配器类型(默认参数为std::allocator<T>)。如果您的编译器不支持可变参数模板,例如没有Nov CTP的VS2012,那么请使用此

template <template<typename, typename> class V, typename U, typename A>
trytemplate(const V<U, A>& p)
{
    std::cout << p[0] << " " << p.size() << std::endl;
}