声明使用相同参数的两个不同方法
Declaring two different methods which use the same parameters
我有两种方法可以设置构造平行四边形:
parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);
第一个从三个点中创建它并计算第四个点。第二个取一个点和两个向量,并从中计算其他三个点。但是,点和矢量都存储为 3D 矢量tiny_vec<float, 3>
有什么约定如何处理吗?将它们合并到一个方法中并添加bool use_height_and_width
参数?添加一个无用的参数并给它一个默认值?
没有找到任何答案,只是相反的问题(不同的类型,一种方法)
给函数不同的名称,使参数的含义清晰。如果它们是构造函数,请改为适当地命名返回平行四边形对象的静态成员函数。
请参阅命名构造函数习惯用法。
使点和向量具有不同的类型。这也有助于捕获错误,例如将两个点加在一起。
标签调度将有助于区分正确的函数:
struct from_vecs {};
parallelogram(tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(from_vecs, tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);
甚至:
struct from_points {};
struct from_vecs {};
parallelogram(from_points, tiny_vec<float, 3> p1, tiny_vec<float, 3> p2, tiny_vec<float, 3> p3);
parallelogram(from_vecs, tiny_vec<float, 3> p1, tiny_vec<float, 3> height_vec, tiny_vec<float, 3> width_vec);
否则,请使用模板函数:
enum class Tag { Points, Vecs };
template<Tag>
parallelogram(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>);
因此完全专业化:
template<>
parallelogram<Points>(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>) { }
template<>
parallelogram<Vecs>(tiny_vec<float, 3>, tiny_vec<float, 3>, tiny_vec<float, 3>) { }
稍后可以将其调用为:
parallelogram<Vecs>(/* ... params ...*/);
我见过的一个现实生活中的场景是在运行时使用枚举(或 #define 等)和调度函数。像这样:
enum f_tybe
{
f1,
f2,
f3
}
int f(f_type ft, int a, int b)
{
switch(ft)
{
case f1:
return f1imp(a, b);
break;
case f2:
return f2imp(a, b);
break;
case f3:
return f3imp(a, b);
break;
}
或者像这样添加额外的参数:
int f(int a, int b)
int f(int a, int b, void* c)
我个人在一些大型框架(winapi,directx等)中看到了这两种情况。
但最好的办法是给函数指定不同的名称。
相关文章:
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 比较两个节点坐标的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 检查两个向量是否并行的最有效方法
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- 区分两个零arg构造函数的惯用方法
- 在C++中将返回unique_ptr和shared_ptr的两个工厂方法组合为一个
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- std::list 的两个 insert() 方法签名之间的实现差异
- 两个继承类如何调用彼此的方法?
- 为什么我们不能同时实现两个方法'getAB() &&'和'getAB()'?
- 编写两个方法的最佳方法,这些方法在C++中返回同一项的值和引用
- 访问对象 B 中对象 C 的方法,这两个方法均由对象 A 创建
- GoogleMock:期待两个方法调用中的任何一个
- Qt在两个不同的线程中运行同一对象的两个方法
- 两个方法声明都"pass by reference"吗?