2017-04-22 45 views
3

是否有使用類似的方式:花::元組自動&&參數... args

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>); 

的東西,如:由於與該代碼

template < typename ... Ts > 
struct Final { 

    constexpr Final(Ts && ... args) {} 
}; 

hana::unpack(foo, [] (auto && ... args) { return Final(args...); }); 

unpack不能推導出lambda /函數類型。 基本上我想創建一個類型,它接受一個參數列表,但我有一個包含參數的元組。

+0

該代碼無效C++ 14或C++ 17。你在使用Concepts嗎? –

+0

@KerrekSB我不需要這裏的概念,你能告訴我爲什麼它是無效的嗎? –

+0

'auto'在C++中不是有效的函數參數類型。它只能在lambda表達式中使用。 –

回答

4

的問題是在你的拉姆達:

[](auto && ... args){ return Final(args...); } 
//       ~~~~~~~ 

Final不是一個類型,它是一個類模板。因此,您需要明確提供類型。喜歡的東西:

[](auto&&... args){ return Final<decltype(args)...>(
    std::forward<decltype(args)>(args)...); } 

在C++ 17,與模板扣類模板參數時,Ts&&不充當轉發參考(見related answer),所以隱扣指南將無論如何也符合您的使用如你只提供左值,而指導需要重估。但是,這會工作:

[](auto... args){ return Final(std::move(args)...); } 
+1

也許這會更好,如果構造函數採取價值的Ts,並做了'std :: move'而不是在lambda。 –

1

如果我正確理解你的問題,你實際上尋找的是

template <typename ...Ts> 
struct Final { ... }; 

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>); 
auto final_type = hana::unpack(foo, [](auto ...args) { 
    return Final<typename decltype(args)::type...>; 
}); 
// now, final_type is a hana::type<Final<Foo1, Foo2>> 

您也可以使用hana::template_實現同樣的事情:

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>); 
auto final_type = hana::unpack(foo, hana::template_<Final>); 

我在巴里的回答中看到的問題是,您最終會創建一個Final<decltype(hana::type_c<Foo1>), decltype(hana::type_c<Foo2>)>,這可能不是您想要的。

+0

我認爲你受到了我以前的問題的影響,因爲我的目標不是創建具有類型元組的最終類型。如果你想要更多的上下文,我在這裏與Jason Rice解決方案一起工作:https://stackoverflow.com/questions/43089587/change-runtime-research-for-a-compile-time-one我想加入幾個multi_map。或者,我只是誤解了你的答案,不好意思^^「 –

+0

不用擔心,我只是說巴里的解決方案,如果你解包(foo,lambda-he-provided)',你最終會得到'Foo 「,類型>',這看起來有點奇怪,無論如何,我很高興Barry的解決方案可以解決你的問題 –

+0

啊,沒錯,Barry的回答並沒有解決OP'foo'是一個事實'hana :: type'元組。 –