【问题标题】:C++ function to return comparator-generic map type based on parameter?基于参数返回比较器通用映射类型的C++函数?
【发布时间】:2017-03-27 12:17:28
【问题描述】:

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

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

【问题讨论】:

  • 请检查您的return 语句,您检查的变量有误
  • 一个函数必须有一个返回类型
  • 函数在编译时必须有一个固定的返回类型。它不能在运行时改变它。

标签: c++ templates stl


【解决方案1】:

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

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

【讨论】:

  • @LukeAndreson:不客气。如果您觉得它回答了您的问题,请不要忘记接受我的回答。
【解决方案2】:

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

现在您可以做的是使用非类型模板并使用 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>();
}

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

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2019-07-15
    • 2021-11-10
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多