具有模板或泛型的动态名称功能

时间:2019-01-16 13:00:09

标签: java c++ oop

是否有任何方法可以根据使用的泛型或模板动态地或预编译Java或C ++中的方法或函数的名称?这是一个表达想法的代码:

Java:

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) { ... }
}

但是可以用其他输入定义向量空间,这就是我试图为程序利用的通用概念定义的空间。

2 个答案:

答案 0 :(得分:2)

我个人认为-正如@ Jarod42所提到的-Adder<MyClass>().add(myObject)这样的解决方案就足够了;我认为无需两次MyClass的上下文,即通过模板参数一次,而第二次通过此参数化类的成员函数的名称来表示。

无论如何,如果您正在寻找类似的东西,那么在预处理器中就需要一些东西,因为这与生成令牌有关。您可以通过令牌级联##来实现此目标,如下所示。

但是请注意:此类代码通常非常棘手,不常见且容易出错,我不建议使用它:

#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,我认为您无法实现类似的目标。据我所知,没有办法在某种预处理器中“动态”创建令牌。

答案 1 :(得分:0)

否,不需要此功能。在您的示例中,您可以轻松地使用方法重载。 (不适用于Java)

// c++
template <typename T, typename R>
class Adder
{
    void add(T t);
    void add(R r);
}

在编译时会自动选择正确的功能。 (注意:仅当T和R没有相同的类型时有效)