我无法理解一些c ++模板代码

时间:2017-01-25 08:25:15

标签: c++

我正在阅读一些代码,但我无法弄清楚如何理解TH_convert<Elements>::t()...

  1. 我在谷歌搜索过,发现...可用于printf(char **, ...)等可变数量的参数。但是,以下几行不同。

  2. 我看到有人将成员函数声明为void test(...)。这是正确的,因为变量参数的功能需要第一个参数。

  3. 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;
    };
    

1 个答案:

答案 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}}结果一致。