C 模板调用特定类型类的特定构造函数
c++ templates call specific constructor for specific type of class
我正在尝试使用模板在C 中制作通用二进制树。因此,例如,节点类中的值类型可以是字符串,int或double。
我是从字符串和在方法中创建我的树
标题文件中的节点类,而没有其余方法:
template <class T>
class Node {
public:
Node(const string value){
this->value = value;
this->leftChild = nullptr;
this->rightChild = nullptr;
};
private:
T value;
Node *parent;
Node *rightChild;
Node *leftChild;
};
所以我要问的是如何为特定类型的节点类定义不同的构造函数,例如可以做:
Node<int> node(„2”);
并按照:
来定义和调用构造函数Node(const string value){
this->value = stoi(value);
this->leftChild = nullptr;
this->rightChild = nullptr;
};
在我尝试只有一个构造函数之前,但是过载=运算符:
void operator=(int &n,string &s){
n = stoi(s);
};
但是,当它在课堂外定义时,编译器说"超载'Operator ='必须是非静态成员函数"
首先,您需要了解成员初始化器列表:C 直接初始化对象。因此,您将拥有这样的CTOR:
Node::Node(std::string const& value)
: value(value) // this line will need adjustment; see below
, leftChild(nullptr)
, rightChild(nullptr) {
}
对于通用数据结构,您很可能实际上调整了CTOR参数类型以匹配值类型。通用数据结构处理类型转换是不寻常的。但是,对于下面的讨论,我假设您要坚持使用std::string
,例如,因为该值是从文本文件中读取的。
如果您需要在类型之间进行转换,则需要使用通用类型的转换器。这些有两种口味:
- 现有功能模板,例如
boost::lexical_cast
- 使用特定的自定义点
这两种方法都有其位置,甚至合理结合它们可能是合理的。他们的共同点是,通用代码使用相同的语法,并且特定于类型的处理是在其他地方完成的。
使用boost::lexical_cast
boost::lexical_cast
的想法是将参数转换为字符序列,使用流来产生目标类型并产生结果的结果。实际实现进行了大量优化,以避免对常见转换的昂贵操作,例如,从std::string
到int
IIS的转换与stoi()
相同。
它将像
一样使用Node::Node(std::string const& value)
: value(boost::lexical_cast<T>(value))
, leftChild(nullptr)
, rightChild(nullptr) {
}
使用自定义点
另一种方法是定义特定的自定义点,即,可以由数据结构的用户自定义的通用接口。这种方法的优点是,可以根据数据结构的使用方式进行更大的灵活性,例如,进行合适的转换。使用合适的默认值可以避免每个用户必须定义自定义点的缺点。
假设用于转换的函数称为my_convert
,它可以像这样使用(还有其他方法可以定义自定义点):
Node::Node(std::string const& value)
: value(my_convert<T>(value))
, leftChild(nullptr)
, rightChild(nullptr) {
}
这种方法假设有一个主模板定义了可能定义合适的默认值,例如:
template <typename T>
T my_convert(std::string const& value) {
return boost::lexical_cast<T>(value);
}
可以使用模板专业化为特定目标类型定制它:
template <>
int my_convert<int>(std::string const& value) {
return std::stoi(value);
}
通常,您会让您的构造函数和其他成员乘坐T,您有理由不这样做吗?
template<typename T>
struct Node
{
T value;
Node * left, * right;
Node(T const & value)
: value(value), left(), right()
{ }
...
};
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 构造函数正在调用一个使用当前类类型的函数
- 具有默认模板类型的默认构造函数的类型推导
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 不命名构造函数和析构函数上的类型错误
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 在 C++17 中调用具有不同参数类型的构造函数
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 无法推断类中的类型,构造函数采用 std::array
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 如何在参数中定义隐式类型转换的构造函数?
- C++ - 打印地图<结构,结构,构造函数>类型
- 继承构造函数+非默认构造函数类型的类内初始化失败
- c++ python构造函数类型错误(可能的命名空间问题)
- 具有构造函数类型转换和转换操作符的转换序列