【问题标题】:Can I use std::vector as a template parameter or does it need to be std::vector<T>?我可以使用 std::vector 作为模板参数还是必须是 std::vector<T>?
【发布时间】:2013-05-31 06:35:17
【问题描述】:

我知道这是一个简单的问题,但我就是找不到答案。

我正在尝试做这样的事情,但最终我希望它是 std::shared_ptr 或 std::weak_ptr ,而不是 std::vector:

template <int dim, class ChunkClass, class PtrClass>
class BaseChunkWindow : public IChunkWindow<BaseChunkWindow<dim, ChunkClass, PtrClass>, IChunk<ChunkClass>> {
public:
...
private:
PtrClass< IChunk<ChunkClass> > ptr;  <-- compiler doesn't like this line, however IChunk<ChunkClass>* works
};

【问题讨论】:

标签: c++ templates


【解决方案1】:

这取决于您将其传递给什么,如果您尝试实例化的模板将接受 2 个(或在 c++11 中为可变数量的)类的类模板作为参数,那么您可以传递 std: :vector 到那个。然而,在大多数情况下,模板需要类作为参数,并且您不能传递类模板 std::vector。

    template <class T>
    struct gimme_a_type{};

    template <template <class,class> class T>
    struct gimme_a_template{};

    gimme_a_type<std::vector> //<-- does not compile, expected a type, got a template
    gimme_a_type<std::vector<int> > //<-- compiles, expected a type, got a type
    gimme_a_template<std::vector> //<-- compiles, expected a template, got a template that has the correct signature
    gimme_a_template<std::vector<int> > //<-- does not compile, expected a template, got a type

响应您的编辑,使用类模板作为模板参数存在困难。当您尝试传递的类模板中有默认参数(在我们的例子中为std::vector)时,实际上很难精确匹配参数的数量。 请注意,上面的示例需要一个包含 2 个类的类模板,而不仅仅是一个。这是因为std::vector 有两个参数,第二个对我们来说只是默认为std::allocator&lt;T&gt;

以下示例演示了该问题:

    template <template <class, class> class Tem>
    struct A
    {
        Tem<int> v; //<-- fails to compile on gcc, Tem takes two parameters
        Tem<int, std::allocator<int> >; //<-- compiles, but requires a priori knowledge of Tem
    };

    template <template <class...> class Tem>
    struct A2
    {
      Tem<int> v; //<-- This C++11 example will work, but still isn't perfect.
    };

C++11 的例子更好,但是如果有人传递了一个带有template &lt;class, bool = false&gt; class A3 签名的类,它会再次失败,因为A2 需要可变数量的类,而不是可变数量的任何东西。因此,即使 A3&lt;int&gt; 可能是一个有效的实例化,您也不能将该类传递给 A2
解决方案是始终在模板参数列表中使用类型,并使用std::integral_constant 包装模板来传递整数常量。

【讨论】:

  • 我试图做“template class PtrClass”,直到我看到你的例子才知道怎么做。我也没有考虑传递模板或类型之间的区别。谢谢。
【解决方案2】:

有几种方法可以做到这一点。

有限的方法是使用模板模板参数,只传递有限数量的参数,例如3.

template<template<class,class,class> class Cont, class T, class V, class U>
void f(Cont<T,V,U>&& cont) {
    //...
}

但是,这是相当有限的,如果您决定在未来更改它,可能很难管理。

因此,您可以使用 C++11 中的新可变参数模板这样做:

template<template<class...> class Cont, typename F, typename... Rest>
void f(Cont<F, Rest...>&& cont) {
    //...
}

这适用于其他容器或事物,并且可能更容易管理。

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2023-02-16
    • 2016-03-31
    • 2018-02-02
    相关资源
    最近更新 更多