2017-06-30 8 views
0

タプル付きテンプレートクラスを設計したいタプルを返すラムダ関数をとるクラスのapply()メンバ関数を用意します。 ラムダの戻りタプルの型は、テンプレートクラスの型リストと互換性がある必要があります。しかし、それはコンパイルできません。バリアント型テンプレートクラスのmermber関数にパラメータとしてラムダ式を渡す方法

main.cpp: In function ‘int main()’: 
warning: lambda templates are only available with -std=c++14 or -std=gnu++14 
    auto getTuple = []<typename ... Param, typename ... Types>(const Param & .. 
       ^
main.cpp: In lambda function: 
main.cpp:75:32: error: parameter packs not expanded with ‘...’: 
     std::tuple<Types> items = std::tuple<Types>(p...); 
          ^
main.cpp:75:32: note:   ‘Types’ 
main.cpp:19:43: error: invalid use of ‘auto’ 
    std::tuple<Types...> t = getTuple(param...);  

#include <iostream> 
#include <tuple> 
#include <string> 
#include <type_traits> 
#include <array> 
template <typename... Types> 
class Data 
{ 
public: 
    template<typename ... Param, typename Functor> 
    std::tuple<Types...> apply(Functor getTuple, const Param& ... param) 
    { 
     std::tuple<Types...> t = getTuple(param...); 
     return t; 
    } 
}; 

int main() 
{ 
    Data<std::string, int,double> data1; 
    auto getTuple = []<typename ... Param, typename ... Types>(const Param & ... p) 
    { 
     std::tuple<Types> items = std::tuple<Types>(p...); 
     return items; 
    }; 
    const auto t = data1.apply(getTuple , "hello", 3,1.9); 

    return 0; 
} 

答えて

2

あなたはラムダにテンプレートを与えることはできません:あなたは、単に代わりにautoを使用することがあります。

auto getTuple = [](const auto& ... p) 
{ 
    auto items = std::make_tuple(p...); 
    return items; 
}; 
+0

はどうもありがとうございました!これはC++ 14で動作します! – Wayne

関連する問題