Можно сделать что-то похожее на код в вопросе, но не совсем.
Вызов функции:
int main()
{
CallMe(Foo);
}
ожидает объект в качестве параметра.Объект может быть указателем на функцию, экземпляром класса, лямбда-выражением или чем-то подобным.Это не может быть необоснованная функция шаблона, так как это не объект.Только экземплярная функция является объектом.
Как говорится в исходном вопросе, использование объектов, подобных функциям, является обходным решением и предполагает, что для некоторых пользователей следующее слишком запутанно:
class Foo
{
public:
template <class T> void operator()(T&&);
};
Вместо этого можно использовать общую лямбду, которая в основном такая же, но без всей плиты котла.Общая лямбда выглядит почти как обычная функция:
auto Foo = [](auto x)
{
std::cout << x << '\n';
};
int main()
{
CallMe(Foo);
}