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