2016-12-01 3 views
2

Я хотел бы сделать тип возвращаемого значения общего использования зОго :: функции, но она не работает, код: кода отладки можно найти: http://cpp.sh/5bk5Как вывести тип возвращаемого значения из std :: function?

class Test 
{ 
public: 
    template <typename R, typename F = std::function<R()>> 
    R f(F&& op) { 
    op(); 
    } 

    void t() { 
    int a = 10; 
    f([this, a]() { return "chars"; }); 
    } 
}; 

int main() 
{ 
    t::Test test; 
    test.t(); 
    return 0; 
} 
+0

Возможно использовать 'result_of', чтобы получить при возврате типа? –

+0

Вы пробовали использовать void *? Это способ Cish иметь общие типы. – mgarey

ответ

2

Вы могли бы избежать шаблона/std::function пути и используйте auto для типа возврата.

Если вы можете скомпилировать C++ 14 легко

// Example program 
#include <iostream> 

class Test 
{ 
    public: 
     Test(){ } 

     template <typename F> 
     auto f (F && op) 
     { return op(); } 

     void t() 
     { std::cout << f([this]() { return "chars"; }) << std::endl; } 
}; 


int main() 
{ 
    Test test; 

    test.t(); 

    return 0; 
} 

Если вы можете скомпилировать только C++ 11 вы должны использовать decltype() для Test::f()

template <typename F> 
    auto f (F && op) -> decltype(op()) 
    { return op(); } 
Смежные вопросы