我可以在需要的地方根据数值自动创建一个类实例吗
Can I automatically create a class instance from a numerical value where needed?
假设我有一个表示特殊数值的结构,比如添加了功能的浮点。这只是一个例子。
struct MyCustomFloat {
MyCustomFloat(float value);
MyCustomFloat(double value);
...
};
然后我有了使用该结构实例的其他函数。另一个例子。
MyCustomFloat add(MyCustomFloat x, MyCustomFloat y);
有没有可能实现一种方法,我可以给出int/foat/double/等等。作为这些函数的参数,并将它们自动转换为自定义类型?
这样混乱的代码:
MyCustomFloat result = add(MyCustomFloat(1.5), MyCustomFloat(3.14));
可以用清洁剂代替:
MyCustomFloat result = add(1.5, 3.14);
这将使开发人员不必编写多个版本的函数来接受每种类型的有效构造函数输入。
MyCustomFloat add(int x, int y);
MyCustomFloat add(float x, float y);
MyCustomFloat add(double x, double y);
MyCustomFloat add(int x, double y);
...
可替换为:
它可以,而且您已经实现了一半,因为您已经拥有的构造函数将用于隐式转换。
#include <iostream>
class A {
public:
A(float f) : val_(f) {}
A(double d) : val_(d) {}
A& operator+= (const A& r) {
val_ += r.val_;
return *this;
}
double val() const { return val_; }
private:
double val_;
};
A add(const A& l, const A& r) {
A a = l;
a += r;
return a;
}
int main()
{
std::cout << add(3.14f, 2.71).val() << std::endl;
}
住在Coliru's
如果是这样的话,"清洁"是另一个话题;如果这不是我自己的代码,只会看到main()
,我会期望"添加"添加一个POD浮点和一个POD双精度,并惊讶于预期结果(POD)显然有一个花哨的val成员函数all-of-a-sudden
您的问题有几种解决方案:
-
重载函数:为每个合理的类型和类型组合提供en实现。他们应该只转换参数并用
MyCustomFloat
参数调用方法。在这种情况下,您不需要重载的Constructor。 -
运算符:实现
const MyCustomFloat MyCustomFloat::operator+(const MyCustomFloat &a)
。这样,无论a+b
是什么类型,都可以始终将其用作表达式。在这种情况下,您可以编写一个以MyCustomFloat
为参数的add
函数,并且它们是由重载构造函数构造的。这里不需要过载的add
函数。 -
templates:对于一般情况,您需要一个模板化函数,期望参数实现
+
运算符,即数字类型。此外,您还需要MyCustomFloat
的模板专业化。请参阅下面的示例。要混合类型,您需要两个模板化类型和三个专业化。
工作示例:
#include <cstdio>
struct MyCustomFloat {
double m_value;
public:
MyCustomFloat(double a) : m_value(a){}
double get() const {return m_value;}
// uncomment this for use with operator+
//const MyCustomFloat operator+(const MyCustomFloat &a) const {return m_value+a.get();}
};
// use this whith operator+
/*
MyCustomFloat add (const MyCustomFloat& a, const MyCustomFloat& b) {
return MyCustomFloat(a+b);
}
/**/
// uncomment this for use with template
template <typename T>
MyCustomFloat add(const T& a, const T& b) {
return MyCustomFloat(a+b);
}
template <>
MyCustomFloat add<MyCustomFloat> (const MyCustomFloat& a, const MyCustomFloat& b) {
return MyCustomFloat(a.get()+b.get());
}
/**/
int main (void){
printf("%fn",add(1.2,3.4).get());
printf("%fn",add(MyCustomFloat(1.2),MyCustomFloat(3.4)).get());
return 0;
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何创建一个空的全局类并在启动时实例化它
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在c++中为double类型的数组创建一个unique_ptr
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 创建一个包含 c++ 默认值的环境文件
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };