C++函数来返回基于参数的比较器通用映射类型?

C++ function to return comparator-generic map type based on parameter?

本文关键字:比较器 映射 类型 参数 返回 函数 于参数 C++      更新时间:2023-10-16

我想我可以使用模板魔法来完成此操作,但我不确定如何?

std::map<int,int,std::less> forward_map;
std::map<int,int,std::greater> reverse_map;
?? choose(bool forward)
{
return forward_map ? forward : reverse_map;
}

不能从同一函数返回不同的类型。请改用高阶函数

template <typename TF>
decltype(auto) choose(bool forward, TF&& f)
{
return forward ? f(forward_map) : f(reverse_map);
}

例:

choose(true,  [](auto& m){ /* `m` here is a `forward_map` */ });
choose(false, [](auto& m){ /* `m` here is a `reverse_map` */ });

您将无法使用三元运算符,因为表达式必须在:的两侧返回相同的类型。 您也不能拥有一个在不同路径上返回不同事物的函数,除非它们是协变的,而这些不是。

现在,您可以做的是使用非类型模板并使用布尔类型,然后将该模板专用于真和假。 这将允许您具有具有相同函数名称的不同返回类型。 这样做会给你

template <bool forward> auto make_map();
template <> auto make_map<true>() { return std::map<int,int,std::less<int>>{}; }
template <> auto make_map<false>() { return std::map<int,int,std::greater<int>>{}; }

你会像使用它一样

int main()
{
auto map = make_map<true>();
auto reverse_map = make_map<false>();
}

唯一的问题是模板参数必须在编译时知道。