Есть ли способ получить value_type из шаблона var, который является параметром функции? - PullRequest
3 голосов
/ 12 июня 2019

Я пишу виртуальный метод, и один из его параметров std::vector.Внутри я использую std::unordered_set с теми же value_type из std::vector.

Но я могу изменить value_type из std::vector, и я не хочу менять каждый разтип внутри кода.Чтобы лучше понять, что я говорю (английский не является моим родным языком), просмотрите приведенный ниже код, пожалуйста.

run(std::vector<Node> &data) {
    std::unordered_set<Node> var;
}

И что я ожидаю, это что-то вроде этого:И, конечно, это не работает.Заранее спасибо.

РЕДАКТИРОВАТЬ: Большое спасибо за ответы, и особенно этот: https://stackoverflow.com/a/56563062/11203604

Ответы с шаблоном функции, это невозможно: это перегруженофункция (виртуальная).Что касается шаблона класса, по технической причине в своей будущей работе я не могу сделать его шаблоном, поскольку он может быть общедоступным классом.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 12 июня 2019

Вы можете использовать decltype, чтобы получить тип data, а затем применить ::value_type к этому. Это дало бы вам

std::unordered_set<std::remove_reference_t<decltype(data)>::value_type> var;

Как указано в комментариях Evg , необходимо std::remove_reference_t, поскольку data является ссылкой, и вы не можете применить оператор разрешения области действия к ссылочному типу.

4 голосов
/ 12 июня 2019

Может, просто сделать шаблонную функцию?

template <typename T>
void run(std::vector<T>&)
{
    std::unordered_set<T> set;
}
1 голос
/ 12 июня 2019

Вы можете просто обобщить свою функцию, чтобы она была template для типа контейнера

template<typename Container>
void run(Container const&data) const
{
    std::unordered_set<typename Container::value_type> set;
    for(auto const& x : data) {
        /* do something clever with the datum x */
    }
}

, чтобы она работала с любым типом контейнера, который поддерживает value_type.

ОднакоТрадиционно универсальным способом в C ++ является использование итераторов:

template<typename Iter>
void run(Iter begin, Iter end) const
{
    using value_type = typename std::iterator_traits<Iter>::value_type;
    std::unordered_set<value_type> set;
    for(; begin != end; ++begin) {
        const value_type&x = *begin;
        /* do something clever with the datum x */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...