在可变参数模板中使用pair

时间:2015-10-02 20:36:09

标签: c++ templates c++11 variadic-templates visual-c++-2015

好的,我正在尝试使用可变参数模板在n维中实现一个范围树。我有基本设置工作,但我希望能够选择性地传递模板列表中的比较函数对象,以通过除std :: less之外的其他东西对树进行排序。

我的第一个想法是,我可以使用包含一对作为第一个元素的版本重载模板列表,其中包含类型和比较函数。但我看不到要编译的模板声明行。 Visual C ++(2015)从C2079开始:“std :: pair :: first使用未定义的类'T'”。

无论如何,关于代码。这是一个 小片段显示我正在尝试做的事情:

template <class... Args> class rangetree{
};

template <class T, class... Args> class rangetree<T, Args...> {
public:
  map <T, rangetree<Args...> * > tree;
};

一切正常。但是,当我添加另一个版本的rangetree,并将一对作为第一个模板成员时,我遇到了问题:

template <pair<class T, class Compare>, class... Args> class rangetree<pair<T, Compare>, Args...>{
public:
  map <T, rangetree <Args...> *, Compare> tree;
};

这是我似乎可以通过编译器满意的方式进行格式化的部分。如果应该使用除less之外的其他东西,可以选择将模板成员与比较函数配对。

1 个答案:

答案 0 :(得分:0)

您正在寻找的语法是:

template <class T, class Compare, class... Args>
class rangetree<pair<T, Compare>, Args...>
{
    ...
};

或者,如果您在此处所做的只是提供添加比较器的功能,您可以将此工作外包给元功能:

template <typename T>
struct range_types {
    using key = T;
    using compare = std::less<T>;
};

template <typename T, typename Comp>
struct range_types<pair<T, Comp>>
{
    using key = T;
    using compare = Comp;
};

template <class T, class... Args>
class rangetree<T, Args...>
{
    map <typename range_types<T>::key,
         rangetree <Args...> *,
         typename range_types<T>::compare
         > tree;
};