Рассмотрим следующий класс:
class MyClass
{
public:
template<class T> typename T::result_type apply(T& func)
{
if (is_int())
{
return func(int(0));
}
return func(double(0));
}
...
};
(код не выглядит ужасно полезным, но это всего лишь надуманный пример, демонстрирующий мою точку зрения)
В любом случае, типичный функтор будетбыть примерно таким:
struct MyFunc
{
typedef void result_type;
template<class V> void operator()(V)
{
// do something
}
};
И можно было бы использовать это так:
MyClass c;
MyFunc f;
c.apply(f);
У меня такой вопрос - можно ли изменить MyClass::apply
, чтобы распознать немного другую версиюfunctor в дополнение к исходному , например, тот, который ожидает, что ссылка на объект вызывающей стороны будет передана вместе со всеми другими параметрами, примерно так:
struct MyFuncEx
{
typedef void result_type;
template<class V> void operator()(const MyClass& caller, V)
{
// do something
}
};
Итак, следующеекод также будет компилироваться:
MyClass c;
MyFunc f;
c.apply(f);
MyFuncEx f2;
c.apply(f2);
В качестве бонуса я хотел бы, чтобы компиляция не удалась, если функтор содержит обе перегрузки, то есть следующее должно завершиться неудачей компиляции:это не так важно, если более длинная перегрузка имеет приоритет над более короткой.