Если GetObject()
может возвращать разные типы, то вам нужно будет работать с шаблонами.Примерно так:
template <class T>
int Foo(const T &o) {
return o->GetValue(x, y);
}
int Bar() {
return Foo(GetObject());
}
Это в основном полиморфизм времени компиляции
EDIT : если вам нужно указать, какую функцию вызывать какну, тогда вы можете сделать что-то вроде этого:
template <class T, int (T::*F)(int,int)>
int Foo(const T &o) {
return (o->*F)(x, y);
}
int Bar() {
// there is probably some template magic you can do to avoid knowing "Type" here..
return Foo<Type, &Type::GetValue>(GetObject());
}
РЕДАКТИРОВАТЬ : к чему это сводится, вы можете написать код, подобный этому:
#include <iostream>
struct A {
int GetValue(int x, int y) {
return 42;
}
};
struct B {
int GetValue(int x, int y) {
return 123;
}
};
template <class T, int (T::*F)(int,int)>
int Foo(T &o) {
return (o.*F)(0, 1);
}
int main() {
A a;
B b;
std::cout << Foo<A, &A::GetValue>(a) << std::endl;
std::cout << Foo<B, &B::GetValue>(b) << std::endl;
}
типы A
и B
не связаны, но я могу передать общий обработчик обоим.Вопрос в том, зачем это нужно?Почему бы просто не сделать что-то вроде этого (избежать всего беспорядка):
#include <iostream>
struct A {
int GetValue(int x, int y) {
return 42;
}
};
struct B {
int GetValue(int x, int y) {
return 123;
}
};
int Foo(int x) {
return x
}
int main() {
A a;
B b;
std::cout << Foo(a.GetValue()) << std::endl;
std::cout << Foo(b.GetValue()) << std::endl;
}
Я не вижу, что вы можете получить, имея тип, объект и функцию для вызова, все определяется шаблоном,может просто сделать это напрямую или, возможно, с несколькими простыми тонкими обертками.
Кроме того, почему бы просто не иметь все типы, которые могут быть возвращены с помощью GetObject
, использовать общий интерфейс, от которого они наследуются,так вы можете просто использовать виртуальные функции, как они были предназначены?Это имеет «кодовый запах» ...