我正在阅读一些代码,但我不知道如何理解 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;
};
最佳答案
我会逐个分解它。
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
结果类型的 typedef将 TH_convert<T>::t()
的结果放在一起对于每个 T
在Elements
.
关于c++ - 我无法理解一些 C++ 模板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846609/