我认为我可以使用模板魔法来完成此任务,但我不确定如何?
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;
}
答案 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` */ });