c++模板特征——编译时不包含头文件

标签 c++ templates traits

它是如何工作的?可能这里做错了什么。

def.H

enum some_enum { FAKE = 0, };

template < some_enum T> struct example_trait;

trait_implementation.H

#include "def.H"

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

generic_alg.H

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

ma​​in.C

只要按此顺序包含 header ,我就可以在主程序中运行它

  1. #include trait_implementation.H
    
  2. #include generic_alg.H
    

int main() {
    function<FAKE>();
    return 0; 
}

这是如何编译的? generic_alg.H 可以仅使用前向声明的特征类进行编译。它可以看到以正确顺序包含的特征定义,即使 generic_alg.H 本身不包含 trait_implementation.H。这怎么可能?

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

最佳答案

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

因此,即使 generic_alg.H 使用了它没有定义或包含的内容,唯一直接编译的是 main.C,以及 的完整定义code>trait_implementation.H 直接在 generic_alg.H 之前转储到 main.C 中,因此当它从 编译代码时定义存在>generic_alg.H.

即使它有效,它仍然是一个坏主意,因为现在 每个 使用 generic_alg.H 的源文件都必须显式包含 trait_implementation.H 首先,没有明显的文档说明这种依赖关系。

关于c++模板特征——编译时不包含头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410244/

相关文章:

scala - 更高程度的更高种类?

c++ - 如何让谷歌标志忽略未知的命令行标志?

c++ - 编译器错误 : Undefined symbols for architecture x86_64

c++ - CMake,选择Xcode编译器

c++ - 我可以在宏中编写模板类吗?

javascript - 无法在客户端呈现 EJS 模板

templates - 在vuejs中分离模板,使用webpack

rust - 捕获环境时可以实现特征吗?

c++ - cout 或 printf 两者中哪一个具有更快的 C++ 执行速度?

scala - 案例分类和特征