2017-02-20 3 views
0

Код ниже перенаправляет пакет параметров в определенный пользовательский вызываемый объект (в данном случае - указатель функции). Есть ли способ в C++ 11 вернуть возвращаемое значение callable? В частности, я хочу иметь возможность выводить возвращаемый тип для raise(), чтобы я мог добавить к нему оператор return. Я понимаю, что могу просто добавить параметр шаблона возвращаемого типа, но разве мы не знаем тип возврата из параметра шаблона Func?Пересылка возвращаемого значения общего вызываемого объекта

size_t example(const std::string& str) 
{ 
    return str.size(); 
} 

template <class Func> 
class signal 
{ 
public: 
    signal() 
    { 
    } 

    ~signal() 
    { 
    } 

    void attach(Func handler) 
    { 
     _handler = handler; 
    } 

    template <typename... T> 
    void raise(T&&... args) 
    { 
     auto val = _handler(std::forward<T>(args)...); 
     // How do I return this? 
    } 

private: 
    Func _handler; 
}; 

typedef size_t(*fcn)(const std::string&); 

int main() 
{ 
    signal<fcn> sig; 
    sig.attach(&example); 
    sig.raise("hello!"); 

    return 0; 
} 
+0

Можете ли вы использовать функции C++ 14? – anderas

ответ

4

Это то, что decltype было сделано для.

template <typename... T> 
auto raise(T&&... args) -> 
    decltype(std::declval<Func&>()(std::forward<T>(args)...)) 
{ 
    return _handler(std::forward<T>(args)...); 
} 

decltype(expr) дает тип expr. Обратите внимание, что вам нужно args: Func может быть объектом-функтором с несколькими перегруженными функциями operator() с разными типами возвращаемых данных, вам нужно будет использовать типы аргументов, чтобы определить, какая перегрузка будет использоваться.

+2

В C++ 14 вы можете использовать '-> decltype (auto)' ... Или если вам не нужна эталонность (т. Е. Вы в порядке с * копией *), тогда вы можете просто написать '-> auto'. – Nawaz

+0

@Nawaz 'auto raise (...) -> auto {' будет необязательно подробным. 'auto raise (...) {' будет делать. – anderas

+0

@anderas: Конечно. Я просто хотел, чтобы мои комментарии были краткими, так как это мелочь. – Nawaz

Смежные вопросы