【问题标题】:Dynamically name function with template or generics使用模板或泛型动态命名函数
【发布时间】:2019-01-16 13:00:08
【问题描述】:

是否有任何方法可以根据所使用的泛型或模板在 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);

一个更具体的例子:定义在矩阵集合中的向量空间,在实数集合中,定义了一个返回矩阵的矩阵乘法(Matrix X Matrix)和一个也返回矩阵的实数乘法(Real X Matrix),其中不同的实现。例如:

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

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

【问题讨论】:

  • C++ 中的邪恶宏,但 Adder&lt;MyClass&gt;().add(myObject) 有什么问题?
  • 不要将 java 泛型与 c++ 模板混淆,它们是完全不同的野兽。它基本上是一个两个问题
  • 等等什么?如果它是用 Java 或 C++ 编写的,对你来说到底有什么关系呢?你心里有目标吗?
  • 如果您希望方法具有不同的名称,那么为什么它们应该是同一个模板的实例化?建议您阅读xy problem。了解用例有助于回答问题(有时需要给出正确答案)
  • @LBald 但这些方法会做不同的事情,还是做同样的事情?如果他们做同样的事情,为什么他们要不同的名字?如果他们做不同的事情,他们怎么可能是通用的?

标签: java c++ oop


【解决方案1】:

我个人认为——正如@Jarod42 所提到的——像Adder&lt;MyClass&gt;().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,我不认为你可以实现类似的东西;据我所知,没有办法在某种预处理器中“动态”创建令牌。

【讨论】:

  • 我看不出这样做的真实理由,但是是的,这很棘手,不常见且容易出错:P
  • 这与 OP 要求的不同吗?我认为他的意思是两者都使用 posfix 方法添加到同一个类中
  • @BigMike:是的,它是“美丽的”(对于具有非常特殊审美意识的人):-)
  • @Phins:是的;在写我的答案时,问题似乎已经改变。在这种情况下,仅用于方法定义的 makro 就足够了。
【解决方案2】:

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

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

在编译时会自动选择正确的函数。 (注意:仅当 T 和 R 的类型不同时才有效)

【讨论】:

  • 这只有在 TR 有界产生不同的擦除时才能在 java 中工作。
  • 在 c++ 中也仅当 TR 不同时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多