шаблонный вывод параметров в C ++ - PullRequest
1 голос
/ 26 мая 2020

Есть ли способ сконструировать этот код так, чтобы мне не приходилось указывать параметр шаблона bar?

, т.е. он в настоящее время не компилируется, но будет компилироваться, если я изменю bar(v) на bar<int>(v) в main.

#include <cstdlib>
#include <vector>

template <class T>
struct foo
{
    foo(std::vector<T>& v)
    {
    }
};

template <class T>
void bar(const foo<T>& f)
{
}

int main()
{
    std::vector<int> v;

    bar(v); // does not compile
    bar<int>(v); // compiles but is undesirable

    return EXIT_SUCCESS;
}

1 Ответ

2 голосов
/ 26 мая 2020

Компилятору разрешено только одно неявное преобразование, но вы можете добавить перегрузку для bar, которая пытается преобразовать все, что вы ему передаете, в foo, а затем вызывает исходный bar с временным foo (который это то, что произошло бы, если бы в исходном коде было разрешено два неявных преобразования):

template<typename T>
void bar(T& v) {
    return bar(foo(v));
}

Поскольку конструктор преобразования в foo не принимает аргумент const&, это также не может bar перегрузка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...