C++ C++;使用模板时,分离类的声明和定义的最佳方法是什么

C++ C++;使用模板时,分离类的声明和定义的最佳方法是什么,c++,C++,关于这个话题我搜索了很多。我遇到了三种方法。假设我们有3个文件,main.cpp、声明头文件和definiton cpp文件。 第一种方法建议在cpp文件中创建一个临时对象。 第二种方法建议在主文件中同时包含cpp和头文件。 第三种方法建议在头文件中包含cpp文件 现在的问题是:哪种方法是最好的?我所说的“最佳”是指性能好和代码风格好。 还有其他更好的方法吗?模板应该始终在类主体内定义。这是最受欢迎的解决方案,因为它简单、清晰,并允许您避免大量不必要的键入 考虑以下类别: template &l

关于这个话题我搜索了很多。我遇到了三种方法。假设我们有3个文件,main.cpp、声明头文件和definiton cpp文件。 第一种方法建议在cpp文件中创建一个临时对象。 第二种方法建议在主文件中同时包含cpp和头文件。 第三种方法建议在头文件中包含cpp文件

现在的问题是:哪种方法是最好的?我所说的“最佳”是指性能好和代码风格好。
还有其他更好的方法吗?

模板应该始终在类主体内定义。这是最受欢迎的解决方案,因为它简单、清晰,并允许您避免大量不必要的键入

考虑以下类别:

template <CharEncoding Encoding>
class UnicodeConverter
{
protected:
    template <typename Input_char_type, typename Output_char_type>
    class InternalHelper
    {
    public:
        void function_a()
        {
            //do something
        }
    };

    //...
};
模板
类单极性反变换器
{
受保护的:
模板
类内部帮助器
{
公众:
空函数_a()
{
//做点什么
}
};
//...
};
现在想象一下,如果您想要一个单独的定义文件,您需要编写什么:

template <CharEncoding Encoding>
template <typename Input_char_type, typename Output_char_type>
void UnicodeConverter<Encoding>::InternalHelper<Input_char_type, Output_char_type>::function_a()
{
  //do something
}
模板
模板
void uniconverter::InternalHelper::function_a()
{
//做点什么
}
那肯定既不好看也不可读,你不同意吗

在某些情况下,定义必须分开(例如,两个相互依赖的模板),但在大多数情况下:避免

将实现放在单独的
.cpp
文件中的规则通常不适用于模板。C++标准库也主要是基于头的,因为它广泛使用模板来实现所有的事情。 另外,请注意,我的示例代码是一个真实的示例,取自真实的应用程序(稍加修改)。想象一下,这不是我在这个项目中拥有的最复杂的模板

第一种方法建议在cpp文件中创建一个临时对象

?

第二种方法建议在主文件中同时包含cpp和头文件

大多数编译器不支持以这种方式拆分模板代码。这将需要使用外部模板定义,但目前尚未得到广泛支持。大多数编译器要求在同一翻译单元中声明和定义模板。这就引出了第三个选项

第三种方法建议在头文件中包含cpp文件

这是大多数人采取的方法,如果他们甚至从定义中分离他们的模板声明(参见下面的第四个选项)。但是,通常将定义文件命名为
.icc
文件扩展名,而不是
.cpp
,以便更清楚地区分。例如:

myfile.h:

template<typename T>
class TMyClass
{
public:
    void doSomething(T value);
};

#include "myfile.icc"
template<typename T>
class TMyClass
{
public:
    void doSomething(T value)
    {
        //...
    }
};
模板
类TMyClass
{
公众:
空隙剂量测定(T值);
};
#包括“myfile.icc”
myfile.icc:

template<typename T> void TMyClass<T>::doSomething(T value)
{
    //...
}
模板void TMyClass::doSomething(T值)
{
//...
}
这就引出了第四个选项——根本不拆分代码,而是内联实现。这是编写模板的更常见的方法。例如:

myfile.h:

template<typename T>
class TMyClass
{
public:
    void doSomething(T value);
};

#include "myfile.icc"
template<typename T>
class TMyClass
{
public:
    void doSomething(T value)
    {
        //...
    }
};
模板
类TMyClass
{
公众:
无效剂量测定(T值)
{
//...
}
};

我想说没有性能差异,但不是100%确定。其余的是基于意见的,在我看来,包括
cpp
文件对我来说很难看,根本不清楚你在问什么。模板通常没有cpp。也许你可以写一个小例子代码。另外,我不明白你说的“在cpp文件中创建一个临时对象”是什么意思。你能把链接放在哪里,你在哪里找到这三个方法?例如,或者@tobi303,你可以在这里找到很多例子,所以没有在类主体中包含函数定义表明它应该是内联的吗?不。忘记整个“内联提示”。编译器不关心您对内联的看法,在判断这种优化方面,他可以比您做得更好<代码>内联是链接器使用的关键字。它告诉他,某个函数的多个定义(如果遇到)不应该被视为错误,并且是允许的。处理这种情况有两种主要技术:
1。
处理使用
静态
存储说明符声明的函数或
2。
明智地操作并将所有这些副本合并为一个。若编译器并没有内联这个函数,所有这些都会发生。