模板类型的显式初始化

C++ / Template / Explicit init of template type?

本文关键字:初始化 类型      更新时间:2023-10-16

假设以下虚拟模板:

template < class DataType > class Dummy
{
public:
    void init( )
    {
        m_data = DataType( 0 );
    }
private:
    DataType m_data;
};

调用init将初始化内部数据。当DataType是标准数据类型(例如int或float)时,这确实工作得很好。当DataType是一个类时,该类必须有相应的构造函数。

现在假设DataType是一个由合适的类表示的复数。在这种情况下,给Complex number类一个只有一个参数的构造函数是没有意义的,因为在正常情况下,您需要初始化实部和虚部。

我的问题是:在考虑模板应该适合存储任何数据类型的情况下,初始化模板类型的最佳泛型方法是什么?

我认为例如STL必须实现这样的想法,但我在代码中迷失了。

我想你的意思是:

DataType( 0 );

:

Data ( 0 );

无论如何,尝试:

m_data = DataType();

将为类类型调用默认构造函数,或者为内置类型调用零初始化。

您可以使用默认参数:

template <class T> 
class A
{
public:
    void init(T c = T()) //default argument
    {
        m_data = c;
    }
private:
    T m_data;
};

如果模板参数类型T是用户自定义的类型,并且它没有定义默认的构造函数,那么你必须自己传递一个参数给init()函数,否则会导致编译错误。

这是标准库所采用的方法。例如,std::vector::resize()接受一个可选参数,其原理与上面提到的相同。

实际上,您在这里考虑的是"默认可构造"类,也就是说,可以在没有特定于类的输入的情况下进行初始化的类。STL在编写时考虑到了这一术语,并且正如@DanielEarwicker所写,内置类型的默认构造函数定义为零初始化。

因此,要获得这样的功能,您的复数类必须支持默认构造函数,即没有参数的构造函数。

相关文章: