是否有任何方法可以根据使用的泛型或模板动态地或预编译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) { ... }
}
但是可以用其他输入定义向量空间,这就是我试图为程序利用的通用概念定义的空间。
答案 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没有相同的类型时有效)