Если вы отложите работу до другой функции шаблона, вы можете использовать вывод аргумента шаблона на T :: bar, чтобы понять это.
// templated on the original type, and the return type of the function
template <typename T, typename mem_fn_return_type>
void doThePush (T& instance, mem_fn_return_type (T::*barptr)(void))
{
std::vector<mem_fn_return_type> v;
v.push_back((instance.*barptr)());
v.push_back((instance.*barptr)());
v.push_back((instance.*barptr)());
std::cout << v.size() << std::endl;
}
template <typename T>
void foo(T x)
{
doThePush(x, &T::bar);
}
Однако, если вам нужен тип в нескольких местах, вероятно, лучше использовать приемы в одном из других ответов.