More Related Content
Similar to Episteme variadic template (20)
Episteme variadic template
- 2.
variadic function
お馴染み printf(const char* format, ...)
printf(“I‟m %s, %d years old.”, “Adam”, 20);
variadic macro
#define FL_printf(format,...)
printf(“%s(%d) “ format, __FILE__, __LINE__, __VA_ARGS__)
FL_printf(“I‟m %s, %d years old.”, “Adam”, 20);
…そして variadic template
- 6.
sizeof...
size_t items = sizeof...(Ts);
size_t items = sizeof...(vs);
packの展開
template<typename ...Ts>
void f(Ts&& ...vs) {
g(3.14, std::forward<Ts>(vs)...);
}
- 7. 書式
展開
Ts...
Ts&&...
X<Ts,Y>::z...
X<Ts,Us>...
F(5, vs)...
T1, … , Tn
T1&&, … , Tn&&
X<T1,Y>::z, … , X<Tn,Y>::z
X<T1,U1>, … , X<Tn,Un>
F(5,v1), … , f(5,vn)
- 9. f(12, „3‟); すると…
void f(int v1, char v2) {
// g(A<Ts...>::h(vs)...);
g(A<int,char>::h(v1), A<int,char>::h(v2));
// g(A<Ts...>::h(vs...));
g(A<int,char>::h(v1,v2));
// g(A<Ts>::h(vs)...);
g(A<int>::h(v1), A<char>::h(v2));
}
- 10.
キモは「パターン・マッチング」
template<class T1, class T2>
bool isOneOf(T1&& a, T2&& b) {
return a == b;
}
template<class T1, class T2, class ...Ts>
bool isOneOf(T1&& a, T2&& b, Ts&& ...vs) {
return a == b || isOneOf(a, vs...);
}
assert( isOneOf(1, 2, 3.5, 4, 1, 2) );
- 11.
キモはやっぱり「パターン・マッチング」
// tuple<T0,T1,T2...> :
// tuple<char,int,const char*> t; get<0>(t) = „A‟; get<1>(t) = 12; …
template<int N, typename ...Ts> struct tuple_data;
template<int N> struct tuple_data<N> {};
template<int N, typename Thead, typename ...Tbody>
struct tuple_data<N, Thead, Tbody...>
: public tuple_data<N + 1, Tbody...> {
Thead value;
};
template<typename ...Ts>
struct tuple : public tuple_data<0, Ts...> {};
- 13.
キモは「パターン・マッチング」
template<int N, typename Thead, typename ...Tbody>
Thead& get_tuple_data(tuple_data<N, Thead, Tbody...>& t)
{ return t.value; }
template<int N, typename ...Ts>
auto get(tuple<Ts...>& t) -> decltype(get_tuple_data<N>(t))
{ return get_tuple_data<N>(t); }
/* おためし */
int main() {
tuple<char,int,const char*> t;
get<0>(t) = 'T'; get<1>(t) = 4; get<2>(t) = "two";
}