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

标签 c++

我正在阅读一些代码,但我不知道如何理解 TH_convert<Elements>::t()... .

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

  2. 我看到有人将成员函数声明为 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_cattypename 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() 的结果放在一起对于每个 TElements .

关于c++ - 我无法理解一些 C++ 模板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846609/

相关文章:

c++ - 使用自定义运算符减少 OpenMP SIMD

C++:实现自定义主函数

c# - 通过 C# 调用 Win32 api 失败!

c++ - C++引用和退出范围

c++ - EXC_BAD_ACCESS 在字符串流对象上使用 <<

c++ - 升级 VS2010 项目导致 '0xC0000005: Access violation reading location 0xCDCDCDCD.'

当代码链接到 exe 时 C++ 程序崩溃,但当代码编译成 exe 时工作正常,这是怎么回事?

c++ - 返回对局部变量及其行为的引用

c++ - 提升文件系统困难

c++ - WTL,无法创建工具栏