Динамически называть функцию с шаблоном или шаблонами - PullRequest
0 голосов
/ 16 января 2019

Существует ли какой-либо способ динамического или прекомпиляционного имени метода или функции в 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, в вещественном наборе, определило умножение матриц, которое возвращает матрицу (Matrix X Matrix), и реальное умножение, которое также возвращает матрицу (Real X Matrix), с различные реализации. e.g.:

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 голосов
/ 16 января 2019

Лично я считаю, что, как упоминал @ 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, напротив, я не думаю, что вы можете достичь чего-то подобного; Насколько мне известно, нет способа "динамически" создавать токены в каком-то препроцессоре.

0 голосов
/ 16 января 2019

Нет, и такая функция не нужна. В вашем примере вы можете легко использовать Метод перегрузки . (Не работает в Java)

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

Правильная функция выбирается автоматически во время компиляции. (Примечание: работает только если T и R не имеют одинаковый тип)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...