In your case, std :: function is optional, use a direct functor.
template<typename T>
struct func
{
void operator ()(T t)
{
std::cout << t << "\n";
}
};
template<typename T>
struct Foo
{
func<T> bar;
};
int main()
{
Foo<int> foo;
foo.bar(24);
return 0;
}
EDIT: In general, move a template from a structure declaration to an operator, i.e. How:
struct func
{
template< typename T >
void operator()(T t ) const { std::cout << t << '\n'; }
};
struct Foo
{
func m_func;
};
int main(){
Foo f;
f.m_func(24);
f.m_func("hello world");
f.m_func(3.143);
};
++ 14, std:: less < > , std:: < > , , , .
Edit2: :
struct func{
template< typename T > void operator()(T t) const{ std::cout << t << '\n';}
};
template< typename T, typename Functor>
struct Foo
{
Functor m_Functor;
T m_Data;
};
template< typename T, typename Functor>
Foo<T,Functor> makeFoo(Functor f, T t ) { return {f,t}; }
int print(int i, int j){ std::cout << i+j << '\n' ;}
int main()
{
auto foo = makeFoo(24, func{} );
auto foo2 = makeFoo("hello", std::bind(print, 2, _1) );
}