[英]Make variadic function which takes arbitary functors and returns a tuple of each return value of input functors
我想創建一個函數對象,它接受任意函數對象並返回一個存儲每個函數對象的返回值的元組。
為了實現這個目標,我做了一個class A
class A
{
private:
template <class Ret, class Func>
auto impl(Ret ret, Func func) -> decltype(tuple_cat(ret, make_tuple(func())))
{
return tuple_cat(ret, make_tuple(func()));
}
template <class Ret, class First, class... Funcs>
auto impl(Ret ret, First first, Funcs... funcs)
-> decltype(impl(tuple_cat(ret, make_tuple(first())), funcs...))
{
return impl(tuple_cat(ret, make_tuple(first())), funcs...);
}
public:
template <class Func>
auto operator()(Func func) -> decltype(make_tuple(func()))
{
return make_tuple(func());
}
template <class First, class... Funcs>
auto operator()(First first, Funcs... funcs)
-> decltype(impl(make_tuple(first()),funcs...))
{
impl(make_tuple(first()),funcs...);
}
};
在主要功能中,我做了三個lambdas。
int main(){
auto func1 = [](){ cout << 1 << endl; return 1;};
auto func2 = [](){ cout << 2 << endl; return 2;};
auto func3 = [](){ cout << 3 << endl; return 3;};
A a;
auto x = a(func1, func2);
cout << "ans : " << get<0>(x) << get<1>(x) << endl; // I expect ans : 12
}
這段代碼可以通過gcc 4.7.2編譯。 但是,它沒有像我預期的那樣工作。 我應該如何修改此代碼?
我認為問題是你錯過了一個return
語句:
template <class First, class... Funcs>
auto operator()(First first, Funcs... funcs)
-> decltype(impl(make_tuple(first()),funcs...))
{
return impl(make_tuple(first()),funcs...);
// ^^^^^^
}
沒有它,您的代碼具有未定義的行為。 根據C ++ 11標准的第6.6.3 / 2段:
[...]離開函數末尾相當於沒有值的返回; 這會導致值返回函數中的未定義行為。
顯而易見的問題是,如其他答案所指出的那樣,你缺少一個返回語句。
無論如何,我認為你做得太多了。 這應該工作:
class A
{
public:
template <class First, class... Funcs>
auto operator()(First first, Funcs... funcs) -> decltype((make_tuple(first(),funcs()...)))
{
return (make_tuple(first(),funcs()...));
}
};
int main(){
auto func1 = [](){ cout << 1 << endl; return 1;};
auto func2 = [](){ cout << 2 << endl; return 2;};
A a;
auto x = a(func1, func2);
cout << "ans : " << get<0>(x) << get<1>(x) << endl; // I expect ans : 12
}
@安迪的修復工作,但你可以做到這一點比簡單得多 ,沒有實現過載,也沒有輔助功能:
#include <iostream>
#include <tuple>
template<typename... Args>
auto tuple_from_funs(Args&&... args) -> std::tuple<decltype(args())...>{
return std::make_tuple(args()...);
}
int f() { return 1; }
char g() { return '2'; }
std::string h() { return "jorge"; }
int main() {
auto tup = tuple_from_funs(f, g, h);
std::cout << std::get<0>(tup) << ", " << std::get<1>(tup) << ", " << std::get<2>(tup) << std::endl;
}
在這里演示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.