2016-10-18 23 views
2

輸入/輸出I型有以下問題:獲取可調用

template<typename Func, typename T_in = /*input type of Func */, typename T_out = /*output type of Func */> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
} 

正如你可以看到上面,我試圖實現一個函數foo其中函數f映射到輸入矢量input的每個元素。我的問題如下:我希望輸入向量input的元素的輸入類型爲f(即T_in),並且輸出向量的元素爲輸出類型f(即T_out),但是不會將輸入/輸出類型f明確指定爲foo(由於代碼具有更好的可讀性)。有沒有人知道如何在編譯時自動推導出輸入/輸出類型f

非常感謝提前。

回答

1

可以從input向量推導出類型T_in

我認爲,T_out扣除是std::result_of_t

template <typename Func, typename T_in, 
      typename T_out = std::result_of_t<Func(T_in)>> 
std::vector<T_out> foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<T_out> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 

工作使用的typename std::result_of<Func(T_in)>::type代替std::result_of_t<Func(T_in)>應該也適用於C++ 11,不僅爲C++ 14。

0

使用函數圖,它實際上非常常見的設計模式是C++。我建議你爲此使用std :: Map容器​​。 here is a link

好運:)

+0

謝謝。爲了簡單起見,我在上面的帖子中使用了一個簡化的示例。不幸的是,我真正的例子不能通過使用標準庫來實現。 –

2

decltype將工作這一點,不斷變化的foo的返回類型auto一起。

template<typename Func, typename T_in> 
auto foo(Func f, const std::vector<T_in>& input) 
{ 
    std::vector<decltype(f(input[0]))> res(input.size()); 

    for(size_t i = 0 ; i < input.size() ; ++i) 
    res[ i ] = f(input[ i ]); 

    return res; 
} 


int main() 
{ 
    // example for f(x) = x*x 
    std::vector<float> input = { /* ... */ }; 
    auto res = foo([](float in){ return in*in; }, input); 

    return 0; 
}