Plantilla de función de "sobrecarga" basada en la firma del operador de objeto de función () en C ++ 98

Quiero hacer una función de plantilla que tome una función y un vector y use la función para asignar ese vector a otro vector que será devuelto por la plantilla de función.

Si la función tomada como argumento es una función libre, puede tener una de dos firmas.

// T is the parameter of the function template
T sig1(const T x);
T sig2(const T x, const std::vector<T>& v);

También puede ser un objeto de función en el queoperator() se comportaría como las funciones libres. El uso de la plantilla de función para cualquiera de las 4 posibilidades debe ser transparente.

std::vector<int> v;
// ... fill v somehow ...

// foo is either free function or function object instance
const std::vector<int> a = map_vec(foo, v);

Pregunté cómo hacer esto para C ++ 11 y obtuve una gran respuesta de 0x499602D2.

Plantilla de función "sobrecarga" basada en la firma del operador de objeto de función ()

La respuesta de 0x499602D2 hace uso del hecho de que estas son dos firmas de plantilla distintas en C ++ 11:

template<typename F, typename T>
auto map_vec(F&& fnc, const std::vector<T>& source)
    -> decltype(void(fnc(std::declval<T>())), std::vector<T>{});

template<typename F, typename T>
auto map_vec(F&& fnc, const std::vector<T>& source)
    -> decltype(void(fnc(std::declval<T>(), source)), std::vector<T>{});

También me gustaría saber cómo resolver esto en C ++ 98.

Aquí está mi esfuerzo hasta ahora. Tengo una estructura SFINAE que puede determinar si los objetos de una función toman dos argumentos. No sé cómo hacer que esto funcione tanto para los objetos de función como para las funciones libres. O necesito cambiar la estructura SFINAE para que funcione tanto en los objetos de función como en las funciones libres o necesito usar la sobrecarga para enrutar los objetos de función y las funciones libres por separado.

http://coliru.stacked-crooked.com/a/1471088cbc3b8544

Respuestas a la pregunta(1)

Su respuesta a la pregunta