TmetaTypelist.cpp
Go to the documentation of this file.
#include <utl/meta/meta.h>
#include <gtest/gtest.h>
#include <type_traits>
namespace TmetaTypelist {
using namespace utl;
using namespace meta;
/*
* Types to behave like Fixtures
*/
// Test type_of fixture
template<class T> struct Identity {
using type = T;
};
template<class T1, class T2> struct MfunBin {
using type = int;
};
template<int a, int b> struct MfunBin_i {
using type = int;
};
template<class T1> struct MfunUn1 {
using type = int;
};
template<class T1> struct MfunUn2 {
using type = int;
};
template <typename T> struct Pred_isInt {
using type = std::is_integral<T>;
};
template <typename T> struct Pred_isVoid {
using type = std::is_void<T>;
};
/*
* Test high order metaFun tools
*/
TEST(TmetaTypelist, Invoke) {
using W = wrap <MfunBin>;
using Wi = wrap_i<int, MfunBin_i>;
using W1 = wrap<MfunUn1>;
using W2 = wrap<MfunUn2>;
using Q = quote<MfunBin>;
using Qi = quote_i<int, MfunBin_i>;
using Q1 = quote<MfunUn1>;
using Q2 = quote<MfunUn2>;
// identity
EXPECT_EQ (true, (std::is_same<int, eval<identity<int>>>()));
EXPECT_EQ (true, (std::is_same<int, identity_t<int>>()));
EXPECT_EQ (true, (std::is_same<void*, identity_t<void*>>()));
// invoke, check that invoke un-wraps and un-quotes staff
EXPECT_EQ (true, (std::is_same< invoke<wrap<MfunBin>, int, char>, MfunBin<int, char> >()));
EXPECT_EQ (true, (std::is_same< invoke<quote<MfunBin>, int, char>, MfunBin<int, char> >()));
EXPECT_EQ (true, (std::is_same< invoke<wrap_i<int, MfunBin_i>, int_<7>, int_<42>>, MfunBin_i<7, 42> >()));
EXPECT_EQ (true, (std::is_same< invoke<quote_i<int, MfunBin_i>, int_<7>, int_<42>>, MfunBin_i<7, 42> >()));
// Wrap
EXPECT_EQ (true, (std::is_same< wrap<MfunBin>::template apply<int, char>, MfunBin<int, char> >()));
EXPECT_EQ (false, (std::is_same< wrap<MfunBin>::template apply<int, char>, MfunBin<int, int> >()));
EXPECT_EQ (true, (std::is_same< wrap_i<int, MfunBin_i>::template apply<int_<7>, int_<42>>, MfunBin_i<7, 42> >()));
EXPECT_EQ (false, (std::is_same< wrap_i<int, MfunBin_i>::template apply<int_<7>, int_<42>>, MfunBin_i<42, 7> >()));
// applicable trait
EXPECT_EQ (true, (is_applicable_t<MfunBin, int, long>()));
EXPECT_EQ (false, (is_applicable_t<MfunBin, int>()));
EXPECT_EQ (true, (is_applicable_qt<Q, int, long>()));
EXPECT_EQ (false, (is_applicable_qt<Q, int>()));
EXPECT_EQ (true, (is_applicable_qt<W, int, long>()));
EXPECT_EQ (false, (is_applicable_qt<W, int>()));
EXPECT_EQ (true, (is_applicable_it<int, MfunBin_i, 7, 42>()));
EXPECT_EQ (false, (is_applicable_it<int, MfunBin_i, 42>()));
// defer
EXPECT_EQ (true, (std::is_same<defer<MfunBin, int, void>::type, MfunBin<int, void>>()));
EXPECT_EQ (true, (std::is_same<defer<MfunBin, void>::type, nil_>()));
EXPECT_EQ (true, (std::is_same<defer_i<int, MfunBin_i, 7, 42>::type, MfunBin_i<7, 42>>()));
EXPECT_EQ (true, (std::is_same<defer_i<int, MfunBin_i, 7>::type, nil_>()));
// quote
EXPECT_EQ (true, (std::is_same< quote<MfunBin>::template apply<int, void*>, MfunBin<int, void*> >()));
EXPECT_EQ (false,(std::is_same< quote<MfunBin>::template apply<int, void*>, MfunBin<int, int> >()));
EXPECT_EQ (true, (std::is_same< quote_i<int, MfunBin_i>::template apply< int_<7>, int_<42>>, MfunBin_i<7, 42> >()));
EXPECT_EQ (false,(std::is_same< quote_i<int, MfunBin_i>::template apply< int_<7>, int_<42>>, MfunBin_i<42, 7> >()));
// compose
EXPECT_EQ (true, (std::is_same<invoke<compose_f<MfunUn1>, int>, MfunUn1<int>>()));
EXPECT_EQ (true, (std::is_same<invoke<compose_f<MfunUn1, MfunUn2>, int>, MfunUn1<MfunUn2<int>>>()));
EXPECT_EQ (true, (std::is_same<invoke<compose<W1>, int>, MfunUn1<int>>()));
EXPECT_EQ (true, (std::is_same<invoke<compose<W1, W2>, int>, MfunUn1<MfunUn2<int>>>()));
EXPECT_EQ (true, (std::is_same<
invoke<compose<W1, W2, Wi>, int_<7>, int_<42>>, MfunUn1<MfunUn2<MfunBin_i<7, 42>>>
>()));
EXPECT_EQ (true, (std::is_same<invoke<compose<Q1>, int>, MfunUn1<int>>()));
EXPECT_EQ (true, (std::is_same<invoke<compose<Q1, Q2>, int>, MfunUn1<MfunUn2<int>>>()));
EXPECT_EQ (true, (std::is_same<
invoke<compose<Q1, Q2, Qi>, int_<7>, int_<42>>, MfunUn1<MfunUn2<MfunBin_i<7, 42>>>
>()));
// bind
EXPECT_EQ (true, (std::is_same<invoke<bind_front<Q, int>, long>, MfunBin<int, long>>()));
EXPECT_EQ (true, (std::is_same<invoke<bind_back<Q, int>, long>, MfunBin<long, int>>()));
// Check the case of ill formed parameter composition. Quote must save us
EXPECT_EQ (true, (std::is_same< nil_, invoke<Q, int> >()));
EXPECT_EQ (true, (std::is_same< nil_, invoke<Qi, int_<42>> >()));
EXPECT_EQ (true, (std::is_same< MfunUn1<MfunUn2<nil_>>, invoke<compose<Q1, Q2, Qi>, int_<42>> >()));
}
/*
* Test typelist
*/
TEST(TmetaTypelist, Basics) {
using l1 = typelist<int, int, int>;
using l2 = typelist<int, void*, int, void*>;
using l3 = typelist<>;
EXPECT_EQ (true, (std::is_same<l1, typelist<int>::times<3>>()));
EXPECT_EQ (true, (std::is_same<l2, typelist<int, void*>::times<2>>()));
EXPECT_EQ (true, (std::is_same<l3, typelist<>::times<3>>()));
EXPECT_EQ (true, (std::is_same<l3, typelist<int>::times<0>>()));
EXPECT_EQ (true, (std::is_same<l3, typelist<int, void>::times<0>>()));
EXPECT_EQ (true, (std::is_same<typelist<short, double>, pair<short, double>>()));
EXPECT_EQ (true, (std::is_same<l1, repeat <int_<3>, int>>()));
EXPECT_EQ (true, (std::is_same<l2, repeat_c <2, int, void*>>()));
EXPECT_EQ (3, size<l1>());
EXPECT_EQ (0, size<l3>());
EXPECT_EQ (true, empty<l3>());
// pass typelist to an invocable
EXPECT_EQ (true, (std::is_same< apply_t<quote<MfunUn1>, typelist<int>>, MfunUn1<int> >()));
EXPECT_EQ (true, (std::is_same< apply_t<quote<MfunBin>, typelist<int, long>>, MfunBin<int, long> >()));
}
TEST(TmetaTypelist, ElementAccess) {
using l = typelist<char*, void, void*, long, double, short>;
EXPECT_EQ (true, (std::is_same<char*, at_c<l, 0>>()));
EXPECT_EQ (true, (std::is_same<void*, at_c<l, 2>>()));
EXPECT_EQ (true, (std::is_same<short, at_c<l, 5>>()));
EXPECT_EQ (true, (std::is_same<nil_, at_c<l, 6>>()));
EXPECT_EQ (true, (std::is_same<void, at<l, int_<1>>>()));
EXPECT_EQ (true, (std::is_same<long, at<l, int_<3>>>()));
EXPECT_EQ (true, (std::is_same<char*, front<l>>()));
EXPECT_EQ (true, (std::is_same<short, back<l>>()));
}
TEST(TmetaTypelist, Concat) {
using l1 = typelist<int, long, void>;
using l2 = typelist<void*, int*>;
using l3 = typelist<double, long double, short>;
using l4 = typelist<>;
using conc = typelist<int, long, void, void*, int*, double, long double, short>;
EXPECT_EQ(true, (std::is_same<l4, cat<l4, l4>>()));
EXPECT_EQ(true, (std::is_same<conc, cat<l1, l2, l3, l4>>()));
EXPECT_EQ(true, (std::is_same<conc, cat<l1, l4, l2, l3>>()));
EXPECT_EQ(true, (std::is_same<conc, cat<l4, l1, l2, l3>>()));
}
template<class T1, class T2> struct F {}; // binary invocable
TEST(TmetaTypelist, Fold) {
struct X1 {};
struct X2 {};
struct X3 {};
struct X4 {};
using Q = quote<F>;
EXPECT_EQ(true, (std::is_same<fold<typelist<>, void, Q>, void>()));
EXPECT_EQ(true, (std::is_same<fold<typelist<X1>, void, Q>, F<void, X1>>()));
EXPECT_EQ(true, (std::is_same<fold<typelist<X1, X2>, void, Q>, F<F<void, X1>, X2>>()));
EXPECT_EQ(true, (std::is_same<fold<typelist<X1, X2, X3>, void, Q>, F<F<F<void, X1>, X2>, X3>>()));
EXPECT_EQ(true, (std::is_same<fold<typelist<X1, X2, X3, X4>, void, Q>, F<F<F<F<void, X1>, X2>, X3>, X4>>()));
EXPECT_EQ(true, (std::is_same<rev_fold<typelist<>, void, Q>, void>()));
EXPECT_EQ(true, (std::is_same<rev_fold<typelist<X1>, void, Q>, F<X1, void>>()));
EXPECT_EQ(true, (std::is_same<rev_fold<typelist<X1, X2>, void, Q>, F<X1, F<X2, void>>>()));
EXPECT_EQ(true, (std::is_same<rev_fold<typelist<X1, X2, X3>, void, Q>, F<X1, F<X2, F<X3, void>>>>()));
EXPECT_EQ(true, (std::is_same<rev_fold<typelist<X1, X2, X3, X4>, void, Q>, F<X1, F<X2, F<X3, F<X4, void>>>>>()));
}
TEST(TmetaTypelist, PushPopReverse) {
using list = typelist <int, long, void>;
using l_char = typelist <int, long, void, char>;
using l_cc = typelist <int, long, void, char, char>;
using char_l = typelist <char, int, long, void>;
using cc_l = typelist<char, char, int, long, void>;
using rev = typelist<void, long, int>;
EXPECT_EQ (true, (std::is_same< char_l, push_front<list, char> >()));
EXPECT_EQ (true, (std::is_same< cc_l, push_front<list, char, char> >()));
EXPECT_EQ (true, (std::is_same< list, pop_front <char_l> >()));
EXPECT_EQ (true, (std::is_same< l_char, push_back <list, char> >()));
EXPECT_EQ (true, (std::is_same< l_cc, push_back <list, char, char> >()));
EXPECT_EQ (true, (std::is_same< list, pop_back <l_char> >()));
EXPECT_EQ (true, (std::is_same< rev, reverse <list> >()));
}
TEST(TmetaTypelist, Transform) {
using QBin = quote<MfunBin>; // both metafuctions return int
using QUn = quote<MfunUn1>;
using l1 = typelist<char, int, float>;
using l2 = typelist<void, void, void>;
using r = typelist<int, int, int>;
using r_ulazy = typelist <MfunUn1<char>, MfunUn1<int>, MfunUn1<float>>;
using r_blazy = typelist <MfunBin<char, void>, MfunBin<int, void>, MfunBin<float, void>>;
EXPECT_EQ (true, (std::is_same<r, transform<l1, QUn>>()));
EXPECT_EQ (true, (std::is_same<r, transform<l1, l2, QBin>>()));
EXPECT_EQ (true, (std::is_same<r_ulazy, transform_lazy<l1, QUn>>()));
EXPECT_EQ (true, (std::is_same<r_blazy, transform_lazy<l1, l2, QBin>>()));
}
TEST(TmetaTypelist, Find) {
using l1 = typelist <int, char, long, float>;
using l2 = typelist <char, long, float>;
using l3 = typelist <long, float>;
using empty = typelist<>;
EXPECT_EQ(true, (std::is_same<index_<1>, find_if<l1, same_as<char>>>()));
EXPECT_EQ(true, (std::is_same<Npos, find_if<empty, same_as<char>>>()));
EXPECT_EQ(true, (std::is_same<Npos, find_if<l1, same_as<double>>>()));
EXPECT_EQ(true, (std::is_same<index_<2>, find<l1, long>>()));
EXPECT_EQ(true, (std::is_same<l2, seek_if<l1, same_as<char>>>()));
EXPECT_EQ(true, (std::is_same<empty, seek_if<empty, same_as<char>>>()));
EXPECT_EQ(true, (std::is_same<empty, seek_if<l1, same_as<double>>>()));
EXPECT_EQ(true, (std::is_same<l3, seek<l1, long>>()));
}
TEST(TmetaTypelist, Count) {
using list = typelist<int, void*, char, int, long*, char, int, short>;
using empty = typelist<>;
EXPECT_EQ (true, (std::is_same<size_<3>, count_if<list, same_as<int>>>()));
EXPECT_EQ (true, (std::is_same<size_<2>, count_if<list, same_as<char>>>()));
EXPECT_EQ (true, (std::is_same<size_<0>, count_if<list, same_as<double>>>()));
EXPECT_EQ (true, (std::is_same<size_<0>, count_if<empty, int>>()));
EXPECT_EQ (true, (std::is_same<size_<1>, count<list, void*>>()));
}
TEST(TmetaTypelist, Filter) {
using Q1 = quote<Pred_isInt>;
using Q2 = quote<Pred_isVoid>;
using list = typelist<int, float, char, long*, short, double, void*>;
using filtered = typelist<int, char, short>;
EXPECT_EQ (true, (std::is_same<filtered, filter<list, Q1>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, filter<typelist<>, Q1>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, filter<list, Q2>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, filter<typelist<>, Q1>>()));
}
TEST(TmetaTypelist, Replace) {
using Q = quote<Pred_isInt>;
using list = typelist<int, float, char, long*, short, double, void*>;
using res = typelist<void,float, void, long*, void, double, void*>;
using repl = typelist<int, float, void, long*, short, double, void*>;
EXPECT_EQ (true, (std::is_same<res, replace_if<list, Q, void>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, replace_if<typelist<>, Q, void>>()));
EXPECT_EQ (true, (std::is_same<res, replace_if<res, Q, void>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, replace_if<typelist<>, Q, void>>()));
EXPECT_EQ (true, (std::is_same<repl, replace<list, char, void>>()));
EXPECT_EQ (true, (std::is_same<typelist<>, replace<typelist<>, char, void>>()));
}
TEST (TmetaTypelist, AllAnyNone) {
using l1 = typelist<int, float, char, long*, short, double, void*>;
using l2 = typelist<int, char, long, short>;
using l3 = typelist<>;
EXPECT_EQ (true, (std::is_same<false_, all_of<l1, quote<Pred_isInt>>>()));
EXPECT_EQ (true, (std::is_same<true_, all_of<l2, quote<Pred_isInt>>>()));
EXPECT_EQ (true, (std::is_same<false_, all_of<l3, quote<Pred_isVoid>>>()));
EXPECT_EQ (true, (std::is_same<true_, any_of<l1, quote<Pred_isInt>>>()));
EXPECT_EQ (true, (std::is_same<false_, any_of<l2, quote<Pred_isVoid>>>()));
EXPECT_EQ (true, (std::is_same<false_, any_of<l3, quote<Pred_isVoid>>>()));
EXPECT_EQ (true, (std::is_same<true_, none_of<l1, quote<Pred_isVoid>>>()));
EXPECT_EQ (true, (std::is_same<false_, none_of<l1, quote<Pred_isInt>>>()));
EXPECT_EQ (true, (std::is_same<true_, none_of<l3, quote<Pred_isInt>>>()));
}
}
utl::meta::defer
if_< detail::is_applicable_< F, Ts... >, detail::defer_< F, Ts... >, nil_ > defer
defer alias template for F<Ts...>
Definition: invoke.h:213
meta.h
Include all meta library.
utl::meta::none_of
empty< filter< List, Pred > > none_of
Definition: typelist.h:875
utl::meta::is_applicable_qt
eval< detail::is_applicable_q_< Q, T... > > is_applicable_qt
check if we can invoke Q with parameters T
Definition: invoke.h:168
TmetaTypelist::MfunUn1
Definition: TmetaTypelist.cpp:41
utl::meta::count_if
eval< count_if_impl::count_if_< List, Pred, 0 > > count_if
Definition: typelist.h:755
TmetaTypelist::Pred_isInt::type
std::is_integral< T > type
Definition: TmetaTypelist.cpp:49
utl::meta::filter
eval< filter_impl::filter_< List, Pred, typelist<> > > filter
Definition: typelist.h:800
utl::meta::at_c
eval< at_impl::at_< List, N > > at_c
Definition: typelist.h:245
utl::meta::defer_i
if_< detail::is_applicable_i_< T, F, Is... >, detail::defer_i_< T, F, Is... >, nil_ > defer_i
defer_i alias template for F<T, Is...>
Definition: invoke.h:221
TmetaTypelist
Definition: TmetaTypelist.cpp:24
utl::meta::quote
Definition: invoke.h:234
utl::meta::identity
Definition: invoke.h:54
utl::meta::true_
bool_< true > true_
The type used as a compile-time boolean with true value.
Definition: integral.h:68
utl::meta::replace_if
eval< replace_if_impl::replace_if_< List, Pred, T, typelist<> > > replace_if
Definition: typelist.h:841
utl::meta::size
size_< List::size()> size
Definition: typelist.h:129
TmetaTypelist::MfunBin::type
int type
Definition: TmetaTypelist.cpp:36
utl::meta::push_back
eval< apply< bind_back< quote< typelist >, Ts... >, List > > push_back
Definition: typelist.h:461
utl::meta::back
eval< back_impl::back_< List > > back
Definition: typelist.h:296
utl::meta::at
at_c< List, N::type::value > at
Definition: typelist.h:253
utl::meta::reverse
eval< reverse_impl::reverse_< List > > reverse
Definition: typelist.h:479
utl::meta::repeat
repeat_c< N::type::value, Ts... > repeat
Definition: typelist.h:161
utl::meta::size_
integral_< size_t, v > size_
size_ type: integral constant wrapper for size_t a.k.a std::size_t
Definition: integral.h:110
TmetaTypelist::F
Definition: TmetaTypelist.cpp:193
gtest.h
utl::meta::wrap
Definition: invoke.h:100
utl::meta::replace
eval< replace_if< List, same_as< T >, U > > replace
Definition: typelist.h:848
utl::meta::find
find_if< List, same_as< T > > find
Definition: typelist.h:663
utl::meta::nil_
Definition: integral.h:43
utl::meta::count
count_if< List, same_as< T > > count
Definition: typelist.h:761
utl::meta::Npos
size_< index_t(-1)> Npos
The last position we can express for indexing.
Definition: integral.h:124
utl::meta::cat
eval< cat_impl::cat_< Lists... > > cat
Definition: typelist.h:338
utl::meta::int_
integral_< int, v > int_
int_ type: integral constant wrapper for int
Definition: integral.h:98
TmetaTypelist::Pred_isInt
Definition: TmetaTypelist.cpp:48
utl::meta::false_
bool_< false > false_
The type used as a compile-time boolean with false value.
Definition: integral.h:69
utl::meta::quote_i
Wrap a template F taking literal constants of type T into an Invokable.
Definition: invoke.h:243
utl::meta::seek_if
eval< seek_if_impl::seek_if_< List, Pred, 0 > > seek_if
Definition: typelist.h:705
utl::meta::rev_fold
eval< rev_fold_impl::rev_fold_< List, V, Fn > > rev_fold
Definition: typelist.h:438
utl::meta::fold
eval< fold_impl::fold_< List, V, Fn > > fold
Definition: typelist.h:383
utl::meta::eval
typename Tp::type eval
Type alias for Tp::type. Used to evaluate/extract return type of metafunctions.
Definition: integral.h:49
utl::meta::any_of
not_< empty< filter< List, Pred > > > any_of
Definition: typelist.h:868
utl
STL&#39;s core language concepts.
Definition: _1wire.h:30
utl::meta::all_of
if_< empty< List >, false_, empty< filter< List, compose< quote< not_ >, Pred > > > > all_of
Definition: typelist.h:861
utl::meta::apply_impl::apply_
Definition: typelist.h:172
utl::meta::pop_back
eval< pop_back_impl::pop_back_< List > > pop_back
Definition: typelist.h:526
utl::meta::push_front
eval< apply< bind_front< quote< typelist >, Ts... >, List > > push_front
Definition: typelist.h:450
TmetaTypelist::MfunUn1::type
int type
Definition: TmetaTypelist.cpp:42
utl::meta::pop_front
eval< pop_front_impl::pop_front_< List > > pop_front
Definition: typelist.h:502
utl::meta::detail::compose_
Definition: invoke.h:275
utl::meta::index_
integral_< index_t, v > index_
index_ type: integral constant wrapper for index_t a.k.a std::size_t
Definition: integral.h:106
TmetaTypelist::MfunBin
Definition: TmetaTypelist.cpp:35
TmetaTypelist::MfunBin_i
Definition: TmetaTypelist.cpp:38
TmetaTypelist::MfunUn2::type
int type
Definition: TmetaTypelist.cpp:45
TmetaTypelist::Pred_isVoid::type
std::is_void< T > type
Definition: TmetaTypelist.cpp:53
utl::meta::front
eval< front_impl::front_< List > > front
Definition: typelist.h:274
TmetaTypelist::MfunBin_i::type
int type
Definition: TmetaTypelist.cpp:39
utl::meta::is_applicable_t
eval< detail::is_applicable_< F, T... > > is_applicable_t
check if we can instantiate F with parameters T
Definition: invoke.h:163
utl::meta::find_if
eval< find_if_impl::find_if_< List, Pred, 0 > > find_if
Definition: typelist.h:657
utl::meta::detail::compose_f_
Definition: invoke.h:255
utl::meta::bind_back
Definition: invoke.h:342
EXPECT_EQ
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:16643
utl::meta::repeat_c
typename typelist< Ts... >::template times< N > repeat_c
Definition: typelist.h:155
utl::meta::identity_t
eval< identity< _Tp > > identity_t
identity type alias
Definition: invoke.h:68
TmetaTypelist::Pred_isVoid
Definition: TmetaTypelist.cpp:52
utl::meta::same_as
Definition: invoke.h:352
utl::meta::transform
eval< transform_impl::transform_< typelist< Args... > > > transform
Definition: typelist.h:568
utl::meta::is_applicable_it
eval< detail::is_applicable_i_< T, F, Is... > > is_applicable_it
check if we can instantiate F with parameters Is of type T
Definition: invoke.h:174
TmetaTypelist::Identity::type
T type
Definition: TmetaTypelist.cpp:33
utl::meta::typelist
Definition: typelist.h:65
utl::meta::apply_t
eval< apply< Fn, Seq > > apply_t
Definition: typelist.h:200
utl::meta::invoke
typename Fn::template apply< Args... > invoke
Definition: invoke.h:81
TmetaTypelist::MfunUn2
Definition: TmetaTypelist.cpp:44
utl::meta::wrap_i
Wrap a template F taking literal constants of type T into an Invokable.
Definition: invoke.h:107
TmetaTypelist::TEST
TEST(TmetaTypelist, Invoke)
Definition: TmetaTypelist.cpp:60
utl::meta::seek
seek_if< List, same_as< T > > seek
Definition: typelist.h:711
utl::meta::bind_front
Definition: invoke.h:332
utl::meta::empty
bool_< List::empty()> empty
Definition: typelist.h:140
TmetaTypelist::Identity
Definition: TmetaTypelist.cpp:32
utl::meta::transform_lazy
eval< transform_lazy_impl::transform_lazy_< typelist< Args... > > > transform_lazy
Definition: typelist.h:614