C ++ эквивалент использования Entry getEntries () для более чем двух java параметров - PullRequest
0 голосов
/ 04 апреля 2020

В java у меня есть метод:

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

Я прочитал вопрос о C ++ эквиваленте использования для java параметра / типа возврата ,

я пытаюсь сделать следующее:

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

это компилируется хорошо, но я думаю, что это долго и, возможно, неправильно. Интересно, есть ли лучшее решение?

1 Ответ

0 голосов
/ 04 апреля 2020

Вам просто нужно адаптировать связанное решение, чтобы оно работало на ваше. Ваша попытка (из комментариев) не совсем верна. При использовании enable_if с параметрами шаблона, он должен быть последним параметром и должен появляться только один раз. Таким образом, изменив то, что вы сделали, чтобы переместить V перед enable_if, и изменив enable_if на &&, вы получите:

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