使用模板或泛型动态命名函数

Dynamically name function with template or generics

本文关键字:动态 函数 泛型      更新时间:2023-10-16

有没有办法根据所使用的泛型或模板动态或预编译 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 没有相同的类型时才有效)