@maxwolf

Можно ли описать template от метода класса?

Схематично задача выглядит так: есть класс, например, такой

class A {
public:
	char *f1(int v) {};
	char *f2(int v) {};
}


Можно ли описать функцию, которая в зависимости от аргумента темплейта вызывала бы метод f1() или f2() ?
Как-то так:

template <???fname???>
int F(A *a, int b) {
    return a->fname(b);
}
  • Вопрос задан
  • 2384 просмотра
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Можно ли описать функцию, которая в зависимости от аргумента темплейта вызывала бы метод f1() или f2()?

Вот вам вариант со специализацией и без дополнительных параметров в сигнатуре:
template <int f>
int F(A *a, int b) {
    abort();
}
template<>
int F<1>(A *a, int b) {
    return a->f1(b);
}
template<>
int F<2>(A *a, int b) {
    return a->f2(b);
}
Ответ написан
Комментировать
@tugo
В шаблон можно передать указатель на метод класса.
#include <iostream>     // std::cout

struct A 
{
  int f1(int v) {return v * 5;}
  int f2(int v) {return v * 10;}
};

template <typename Foo>
int F(int b, A * a, Foo foo) 
{
    return (a->*foo)(b);
}

int main () 
{

  A * a = new A;
  
  std::cout <<  F(5, a, &A::f1) << '\n';
  std::cout <<  F(10, a, &A::f2) << '\n';

  return 0;
}

cpp.sh/3l5
Ответ написан
Комментировать
bogolt
@bogolt
Передать имя функции как аргумент нельзя.
Можно это решить через макросы, например так
#define F(a, b, func) a->func(b)

Еще можно передать указатель на функцию, но будет чуть более геморно полагаю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы