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).