在可变参数模板中使用对
Using pair in variadic templates
好的,我正在尝试使用可变参数模板在 n 维中实现范围树。我有基本的设置工作,但我希望能够有选择地在模板列表中传递一个比较函数对象,以按 std::less 以外的其他方式对树进行排序。
我的第一个想法是,我可以使用包含一对作为第一个元素的版本重载模板列表,该对包含类型和比较函数。但我看不到要编译的模板声明行。 Visual C++ (2015) 以 C2079 开头:"std::pair::first uses undefined class '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 以外的东西,可以选择将模板成员与比较函数配对。
您要查找的语法是:
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;
};
好的,我正在尝试使用可变参数模板在 n 维中实现范围树。我有基本的设置工作,但我希望能够有选择地在模板列表中传递一个比较函数对象,以按 std::less 以外的其他方式对树进行排序。
我的第一个想法是,我可以使用包含一对作为第一个元素的版本重载模板列表,该对包含类型和比较函数。但我看不到要编译的模板声明行。 Visual C++ (2015) 以 C2079 开头:"std::pair::first uses undefined class '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 以外的东西,可以选择将模板成员与比较函数配对。
您要查找的语法是:
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;
};