Why use a “tpp” file when implementing templated functions and classes defined in a header?

后端 未结 3 1720
礼貌的吻别
礼貌的吻别 2020-12-05 07:27

Please refer to the first answer in this question about implementing templates.

Specifically, take note of this quote

A common solution to thi

3条回答
  •  遥遥无期
    2020-12-05 08:14

    Does it matter if it's .tpp or any other extension? And why not use a .cpp?

    It does not matter what the extension is, but don't use .cpp because it goes against conventions (it will still work, but don't do it; .cpp files are generally source files). Other than that it's a matter of what your codebase uses. For example I (and the Boost codebase) use .ipp for this purpose.

    What's the significance of a .tpp file?

    It's used when you don't want the file that contains the interface of a module to contain all the gory implementation details. But you cannot write the implementation in a .cpp file because it's a template. So you do the best you can (not considering explicit instantiations and the like). For example

    Something.hpp

    #pragma once
    
    namespace space {
    
    template 
    class Something {
    public:
        void some_interface();
    };
    
    } // namespace space
    
    #include "Something.ipp"
    

    Something.ipp

    #pragma once
    
    namespace space {
    
    template 
    void Something::some_interface() {
        // the implementation
    }
    
    } // namespace space
    

    I thought the whole point of writing definitions in headers and the implementations in a separate file is to save compilation time, so that you compile the implementations only once until you make some changes

    You can't split up general template code into an implementation file. You need the full code visible in order to use the template, that's why you need to put everything in the header file. For more see Why can templates only be implemented in the header file?

    But if the implementation file has some funky looking file extension, how does that work in terms of compiling? Is it as efficient as if the implementations were in a cpp?

    You don't compile the .tpp, .ipp, -inl.h, etc files. They are just like header files, except that they are only included by other header files. You only compile source (.cpp, .cc) files.

提交回复
热议问题