Penso tu abbia frainteso. Quello che voglio controllare è che il parametro che accetta func_t sia non-const ref e non T.
Esempio:
codice:auto f1 = std::bind( [](int&) { }, std::placeholders::_1); // int& auto f2 = std::bind( [](int) {}, std::placeholders::_1); // int auto f3 = std::bind( [](const int) {}, std::placeholders::_1); // const int foo<int>::setFunc(f1); // ok int& (non-const ref) foo<int>::setFunc(f2); // err int (non-const lvalue) foo<int>::setFunc(f3); // err const int (const lvalue)
Uno dei miei tentativi era qualcosa di questo tipo:
codice:template<typename T> struct foo { using func_t = std::function<void(T&)>; static void useFunc() { static_assert(!std::is_reference<T&>::value || std::is_const<T&>, "static_assert failed"); _func(_t); } static void setFunc(const func_t&) {} static func_t func() {} static func_t _func; static T _t; };
Tuttavia anche questo tentativo fallisce perché la funzione che vado a passare può accettare qualsiasi tipo di lvalue, probabilmente mi sfugge qualcosa nella template argument deduction (di cui so poco).

Rispondi quotando