хотел бы, чтобы do_thing({test})
или do_thing(test)
неявно создавали Bar
и передавали это в качестве аргумента, если это возможно.
К сожалению, когда вы вызываете do_thing({test})
илиdo_thing(test)
, test
(или {test}
) не является Bar<T>
объектом.Таким образом, компилятор не может определить тип T
и не может создать объект Bar<T>
.
Этакая проблема с яйцом и яйцом.
Лучшее, что я могу себе представитьсостоит в том, чтобы добавить в Foo
метод do_test()
следующим образом
template<typename T>
auto do_thing (T const & t)
{ return do_thing(Bar{t}); }
Таким образом, вы можете вызывать (без графиков)
std::vector<std::string> s = foo.do_thing(test);
Вы получите тот же результат, что и
std::vector<std::string> s = foo.do_thing(Bar{test});
- РЕДАКТИРОВАТЬ -
ОП спрашивает
Есть ли способ сохранить синтаксис {test} фигурной скобки?может быть с initializer_list или чем-то?
Да ... с std::initializer_list
template<typename T>
auto do_thing (std::initializer_list<T> const & l)
{ return do_thing(Bar{*(l.begin())}); }
но, таким образом, вы также принимаете
std::vector<std::string> s = foo.do_thing(Bar{test1, test2, test3});
, используятолько test1
Может быть, немного лучше ... другой путь может быть через массив в стиле C
template <typename T>
auto do_thing (T const (&arr)[1])
{ return do_thing(arr[0]); }
Таким образом, вы принимаете только элемент.