我正在阅读一些代码,但我无法弄清楚如何理解TH_convert<Elements>::t()...
。
我在谷歌搜索过,发现...
可用于printf(char **, ...)
等可变数量的参数。但是,以下几行不同。
我看到有人将成员函数声明为void test(...)
。这是正确的,因为变量参数的功能需要第一个参数。
class TH_convert{
public:
typedef std::tuple<Element> t;
};
template<typename... Elements>
class State{
public:
typedef decltype(std::tuple_cat(typename TH_convert<Elements>::t()...)) t;
};
答案 0 :(得分:2)
我会逐个分解。
template<typename... Elements>
class State{
//...
};
这定义了一个variadic class template被调用状态,它采用任意数量的模板参数。 State<int,bool>
是一个有效的专业化,State<Foo,Bar,Baz,Qux>
甚至是State<>
。
decltype(/*...*/)
decltype
基本上被替换为/*...*/
中放置的任何表达式的类型。
typedef decltype(/*...*/) t;
这使得t
成为/*...*/
类型的typedef。
typename TH_convert<T>::t()
根据TH_convert<T>::t
的定义,这将创建std::tuple<T>
类型的对象,该对象与TH_convert
相同。您需要typename
,因为它是dependent type。
std::tuple_cat(typename TH_convert<Elements>::t()...)
对于参数包std::tuple_cat
中的每个typename TH_convert<T>::t()
,这会为T
调用Elements
。因此对于State<int,bool>
,它等同于:
std::tuple_cat(TH_convert<int>::t(), TH_convert<bool>::t())
对于State<Foo,Bar,Baz,Qux>
,它与:
std::tuple_cat(TH_convert<Foo>::t(), TH_convert<Bar>::t(),
TH_convert<Baz>::t(), TH_convert<Qux>::t())
所以,把所有这些放在一起:
typedef decltype(std::tuple_cat(typename TH_convert<Elements>::t()...)) t;
这使得t
std::tuple_cat
的{{1}}结果类型的typedef与TH_convert<T>::t()
中每个T
的{{1}}结果一致。