使用模板或泛型动态命名函数
Dynamically name function with template or generics
有没有办法根据所使用的泛型或模板动态或预编译 Java 或C++中的方法或函数?下面是一个代码来绘制这个想法:
爪哇岛:
class Adder<T, R> {
add"T"(T t);
add"R"(R r);
}
...
obj = new Adder<MyClass, ClassTwo>();
obj.addMyClass(myObject);
obj.addClassTwo(objectTwo);
一个更具体的例子:在矩阵集中定义的向量空间,在实数集中,定义了返回矩阵的矩阵乘法(矩阵 X 矩阵)和也返回矩阵的实乘法(实数 X 矩阵),具有不同的实现。 例如:
intereface VectorSpace<T, R> {
...
T multiply"T" (T arg0, T arg1);
T multiply"R" (T arg0, R arg1);
}
...
class RealMatrixVectorSpace implements VectorSpace<Matrix, Real> {
Matrix multiplyMatrix (Matrix arg0, Matrix arg1) { ... }
Matrix multiplyReal (Matrix arg0, Real arg1) { ... }
}
但是向量空间可以用其他输入来定义,我试图为程序定义这个通用概念。
我个人认为 - 正如@Jarod42所提到的 - 像Adder<MyClass>().add(myObject)
这样的解决方案就足够了;在我看来,没有必要表达两次MyClass
上下文,即一次通过模板参数,第二次通过这个参数化类的成员函数的名称。
无论如何,如果你正在寻找类似的东西,你需要在预处理器中有一些东西,因为你是关于生成令牌的。您可以通过令牌串联 makro ##
来实现此目的,如下所示。
但请注意:这种代码通常相当棘手、不常见且容易出错,我不建议使用它:
#define CLASSDEF(NAME) class NAME ## Adder { public: void add(NAME ## Adder a); }
CLASSDEF(MyClass);
CLASSDEF(AnotherClass);
int main() {
MyClassAdder x;
x.add(x);
AnotherClassAdder y;
y.add(y);
}
相比之下,对于Java,我认为你不能实现类似的东西;据我所知,没有办法在某种预处理器中"动态"创建令牌。
不,不需要这样的功能。在您的示例中,您可以轻松使用方法重载。(在Java中不起作用)
// c++
template <typename T, typename R>
class Adder
{
void add(T t);
void add(R r);
}
编译时会自动选择正确的函数。(注意:仅当 T 和 R 没有相同的类型时才有效)
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在动态数组上使用搜索函数
- 通过构造函数动态确定类实现
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 为什么类和 main() 函数中也有动态内存分配
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 运行时的动态函数解析
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 编译时动态函数调用
- C 中的动态函数参数,可能
- 在不模板的情况下计算另一个类的动态函数指针
- C++:传递动态函数和存储函数
- 一个可以使用动态函数交换的函数
- 动态函数来调用函数
- c++中用于Callback / RPC的动态函数参数
- 运行时的动态函数调用(va_list)
- 如何在c++ 11和c++ 14中实现动态函数调用