On C++ weekly ep. 48 by Jason Turner有下面的代碼:可變參數類模板和可變參數的構造函數
template<typename ... B>
struct Merged : B...
{
template <typename ... T>
Merged(T && ... t) : B(std::forward<T>(t))...
{ }
using B::operator()...;
};
它無法與GCC 7.1以下幾點:
error: mismatched argument pack lengths while expanding 'B'
什麼是擴大B中的正確方法是什麼?
(順便說一句,在上面的鏈接,代碼似乎編譯了一些7.0快照)。
EDIT1:
正如@ Jarod42指出,這將對於結構充當仿函數編譯。實際的視頻使用lambda,它似乎打破了那裏。
auto l1 = [] { return 4 ; };
auto l2 = [](const int i) { return i * 10; };
// This would work, S1, S2 are just functors structs
Merged<S1, S2> merged1(42, "hello");
// This fails
Merged merged2 = Merged(l1, l2);
EDIT2:
好像用戶定義的扣除導遊不在這裏工作了。
template <typename ... T>
Merged(T...) -> Merged<std::decay_t<T>...>;
上面應該有啓用以下:
Merged merged(l1, l2);
但事實並非如此。好像你必須通過類型合併<>
Merged<t1, t2> merged(l1, l2);
這可能算不上什麼教程想證明。
是不是C++ 17而不是C++ 11?至少我得到[與c + + 11編譯時完全不同的錯誤](http://ideone.com/Pd4tRO) – user463035818
我想你已經提供了錯誤數量的參數給構造函數? – Quentin
Works [here](http://coliru.stacked-crooked.com/a/5bdcaecb54f760c2)。 – Jarod42