【问题标题】:C++ equivalent of using Entry<? extends ClassA, ? extends ClassB> getEntries() for more than two java parameterC++ 等价于使用 Entry<?扩展A类,?为两个以上的 java 参数扩展 ClassB> getEntries()
【发布时间】:2020-04-04 15:30:49
【问题描述】:

在java中,我有一个方法:

 Set<? extends Entry<? extends ClassA, ? extends ClassB>> getEntries();

我已经阅读了关于C++ equivalent of using <T extends Class> for a java parameter/return type的问题,

我尝试如下:

template<typename K, typename std::enable_if<std::is_base_of<ClassA, K>::value>::type* = nullptr, typename V, typename std::enable_if<std::is_base_of<ClassB, V>::value>::type* = nullptr> set<pair<K,V>> getEntries()

它编译得很好,但我认为它很长而且可能是错误的。我想知道是否有更好的解决方案。

【问题讨论】:

  • 为什么不止一个模板参数会有所不同?您是否尝试过调整链接帖子中的解决方案以满足您的需求?
  • 对不起。我尝试如下:template&lt;typename K, typename std::enable_if&lt;std::is_base_of&lt;ClassA, K&gt;::value&gt;::type* = nullptr, typename V, typename std::enable_if&lt;std::is_base_of&lt;ClassB, V&gt;::value&gt;::type* = nullptr&gt; set&lt;pair&lt;K,V&gt;&gt; getEntries(); 但我认为它很长而且可能是错误的
  • 请编辑问题以包含您尝试的内容。试图在 cmets 中读取它并不容易。
  • 感谢您的指导。其实这是我在stackoverflow中的第一个问题

标签: java c++ generics extends


【解决方案1】:

您只需调整链接的解决方案以适合您的解决方案。您的尝试(来自 cmets)不太正确。当enable_if 与模板参数一起使用时,它应该是最后一个参数,并且应该只出现一次。因此,修改您所做的以将V 移动到enable_if 之前,并将enable_if 更改为使用&amp;&amp;,您会得到:

template<typename K, typename V, typename std::enable_if<std::is_base_of<ClassA, K>::value && std::is_base_of<ClassB, V>::value>::type * = nullptr> 
std::set<std::pair<K, V>> getEntries();

从来都不漂亮。可以使用enable_if_t,这样就不需要::type,但不会节省太多空间。示例:

template<typename K, typename V, typename std::enable_if_t<std::is_base_of_v<ClassA, K> && std::is_base_of_v<ClassB, V>> * = nullptr> 
std::set<std::pair<K, V>> getEntries();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多