繁体   English   中英

在std :: map上使用带有std :: greater附加参数的三元运算符

[英]Using ternary operator on std::map with std::greater additional argument

我有两个std::maps 一个在构造函数中使用std::greater ,所以它的排序方向相反:

std::map<key, value> map1;
std::map<key, value, std::greater> map2;

目前,我有两个函数,每个映射一个,分别迭代元素和处理。 但是,鉴于处理逻辑相同(仅地图迭代方向不同),我想将这两个函数替换为一个:

template<bool useMap1>
void combinedFunc()
{
    std::map<key, value>& map = useMap1 ? map1 : map2;
    std::map<key, value>::iterator iter = map.begin();

    // A fair amount of code iterating over the elements, hence wishing to combine
}

但是,编译器正确地说map1和map2是不兼容的类型。

即使使用std :: greater,也可以重用代码吗?

即使使用std :: greater,也可以重用代码吗?

这是一种方法。

  1. 创建两个重载函数来处理两个地图。
  2. 将处理地图项的核心逻辑移到另一个与迭代器一起使用的函数。

template <typename Iterator>
void coreFunction(Iterator start, Iterator end) { ... }

// For map1
void functionForMap(std::true_type dummyArgument)
{
   coreFunction(map1.begin(), map1.end());
}

// for map2
void functionForMap(std::false_type dummyArgument)
{
   coreFunction(map2.begin(), map2.end());
}

template<bool useMap1>
void combinedFunc()
{
   functionForMap(std::integral_constant<bool, useMap1>());
}

仍然更简单-这仅需要第一个功能。

template<bool useMap1>
void combinedFunc()
{
   useMap1 ? coreFunction(map1.begin(), map1.end()) : coreFunction(map2.begin(), map2.end());
}

为什么不直接使用并指定要使用的类型,而不是使用模板参数来暗示要使用的类型? 就像是:

template<class M>
void combinedFunc(const M & map) // Drop "const" if necessary
{
    M::iterator iter = map.begin();

    // A fair amount of code iterating over the elements, hence wishing to combine
}

然后,调用者负责指定地图。

combinedFunc(map1); // The template parameter should be deducible.

这样的好处是不会将模板仅锁定到两个特定的地图。 不利的一面是,调用者必须了解map1map2 如果combinedFunc是公共接口的一部分,而映射不是,则这可能是不希望的。 在这种情况下,您可以为接口编写包装函数。 像下面这样的简单事情应该起作用。

void publicFunc(bool useMap1)
{
    if ( useMap1 )
        combinedFunc(map1);
    else
        combinedFunc(map2);
}

请注意,即使语法使它看起来像同一函数,它也会调用两个不同的函数。 (您不能执行诸如combinedFunc(useMap1 ? map1 : map2); 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM