c ++模板特征-编译时不包含标题

时间:2019-01-28 21:01:27

标签: c++ templates traits

这如何运作?可能在这里做错了。

def.H

null

trait_implementation.H

enum some_enum { FAKE = 0, };

template < some_enum T> struct example_trait;

generic_alg.H

#include "def.H"

template<> struct example_trait<FAKE> {  
static constexpr size_t member_var = 3;  };

main.C

只要按顺序包含标题,我就可以在主目录中运行它

  1. #include "def.H"
    template < some_enum T, typename TT = example_trait<T> > void
    function() { std::cout << TT::member_var << std::endl; }
    
  2. #include trait_implementation.H
    

#include generic_alg.H

它如何编译?可以使用常规声明的traits类编译generic_alg.H。即使generic_alg.H本身不包含trait_implementation.H,也可以按正确的顺序查看traits定义。怎么可能呢?

使用在线编译器,我只能重新创建:https://onlinegdb.com/B1BEUlp7E

1 个答案:

答案 0 :(得分:2)

SYSTEM出于大多数实际目的,是将#include版文件的内容直接转储到源代码中的请求。

因此,即使include使用了未定义或包含的内容,唯一可以直接编译的是generic_alg.H,并且main.C的完整定义被转储到{{1 }}紧接trait_implementation.H之前,因此当定义从main.C编译代码时就存在该定义。

即使有效,但这仍然不是一个好主意,因为现在使用generic_alg.H每个源文件必须首先明确包含generic_alg.H,并且没有明显的文档制作这种依赖性很明显。