C ++函数根据参数返回比较器 - 通用映射类型?

时间:2017-03-27 12:17:29

标签: c++ templates stl

我认为我可以使用模板魔法来完成此任务,但我不确定如何?

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;
}

2 个答案:

答案 0 :(得分:0)

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

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

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>();
}

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

答案 1 :(得分:0)

您无法从同一功能返回不同类型。请改用高阶函数

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` */ });