C ++ / Template /模板类型的显式初始化?

时间:2011-10-19 15:17:57

标签: c++ templates

假设以下虚拟模板:

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必须实现这样的思考,但我在该代码中丢失了。

3 个答案:

答案 0 :(得分:5)

在你的例子中我猜你的意思是:

DataType( 0 );

Data ( 0 );

无论如何,请尝试:

m_data = DataType();

这将调用类类型的默认构造函数,或者为内置类型调用零init。

答案 1 :(得分:1)

您可以将默认参数用作:

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()采用可选参数,遵循与上述相同的基本原理。

答案 2 :(得分:0)

实际上,您在这里考虑“默认可构造”类,即可以有效地没有特定于类的输入进行初始化的类。 STL是用这个术语编写的,正如@DanielEarwicker所写,默认构造函数是为内置类型定义为零初始化。

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