将非特定模板传递给另一个模板

时间:2018-01-17 07:39:41

标签: c++11 templates

给出以下代码here in IDEOne

tailf /var/log/neutron/neutron-*.log

我收到错误:

#include <iostream>
#include <vector>
#include <list>

template<typename T>
class MyVectorCollection
{
    using collection = std::vector<T>;
};

template<typename C, typename T>
class MyGenericCollection
{
    using collection = C;
};

template<typename C, typename T>
class MyMoreGenericCollection
{
    using collection = C<T>;
};

int main() {
    // your code goes here
    MyVectorCollection<int> a;
    MyGenericCollection<std::list<int>, int> b;
    MyMoreGenericCollection<std::list, int> c; // How to do this?
    return 0;
}

如何编写我的代码,以便我可以在编译时使用prog.cpp:20:24: error: ‘C’ is not a template using collection = C<T>; ^ prog.cpp: In function ‘int main()’: prog.cpp:27:43: error: type/value mismatch at argument 1 in template parameter list for ‘template<class C, class T> class MyMoreGenericCollection’ MyMoreGenericCollection<std::list, int> c; ^ prog.cpp:27:43: note: expected a type, got ‘list’ 而无需明确的潜在特化列表,并在可能的情况下避免使用宏?我知道C<T>不是std::list,但我不知道如何进步,而且我在这里找不到类似的问题。

(请注意,这只是一个MCVE,我实际使用的内容更多。)

1 个答案:

答案 0 :(得分:1)

只是为了整理,这是解决方案。我正在寻找的搜索词是模板模板,虽然我确实找到了可能重复的内容,但我认为这个问题和答案更容易理解。

所以,感谢来自 @Some programmer dude 的提示,我查了template templateupdated the code to this,它确实编译了:

template<template<typename, typename> class C, typename T>
class MyMoreGenericCollection
{
    using collection = C<T, std::allocator<T>>;
};

我们将第一个模板参数声明为模板本身,并且记住标准库构造函数采用两个参数,我们需要使内部模板采用两个参数。 (据我所知)没有办法自动使用默认的第二个参数,所以为了这个例子,我明确说明了默认值。

我当然可以在主模板中添加第三个参数,用于指定分配器,它本身也可以作为模板,但我将其留作读者练习。