我可以使用 std::vector 作为模板参数还是需要 std::vector<T>?
Can I use std::vector as a template parameter or does it need to be std::vector<T>?
我知道这是一个简单的问题,但我就是找不到答案。
我正在尝试做这样的事情,但不是std::vector最终我希望它是std::shared_ptr或std::weak_ptr:
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
};
这取决于你要传递给什么,如果你要实例化的模板接受一个接受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
)时,准确匹配形参的数量实际上很难做到。注意,上面的例子需要一个类模板,它接受两个类型,而不是一个。这是因为std::vector
有两个参数,第二个参数默认为std::allocator<T>
。
下面的例子演示了这个问题:
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 <class, bool = false> class A3
签名的类,它又失败了,因为A2
需要一个接受类型的类模板,而不是类型和非类型的混合(false
是这个例子中的非类型模板参数)。所以即使A3<int>
是一个有效的实例化,你也不能把这个类传递给A2
。解决方案是始终在模板参数列表中使用类型,并使用std::integral_constant
包装器模板传递整型常量。
有两种方法。
有限制的方法是使用模板模板形参,只传递有限数量的形参,例如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) {
//...
}
这将适用于其他容器或东西,并且可能更容易管理。
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g