Uno de mis experimentos personales para comprender algunas de las características de C++ 0x: estoy tratando de pasar un puntero a una función de plantilla para ejecutar. Eventualmente, se supone que la ejecución sucederá en un hilo diferente. Pero con todos los diferentes tipos de funciones, no puedo hacer que las plantillas funcionen.Plantillas, punteros de función y C++ 0x
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 4;};
int something(int a) {return a;};
};
template <class C>
int func(C&& c)
{
//typedef typename std::result_of< C() >::type result_type;
typedef typename std::conditional<
std::is_pointer<C>::value,
std::result_of< C() >::type,
std::conditional<
std::is_object<C>::value,
std::result_of< typename C::operator() >::type,
void>
>::type result_type;
result_type result = c();
return result;
}
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
// call with a member function
bar b;
func(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
// call with a lambda expression
func([](void)->int {return 12;});
return 0;
}
La plantilla result_of por sí solo no parece ser capaz de encontrar el operador() en la barra de clase y la torpe condicional creé no se compila. ¿Algunas ideas? ¿Tendré problemas adicionales con las funciones de const?
Quizás la razón por la que no compila es porque 'func' devuelve' int' en lugar de 'result_type' (que en este ejemplo es' int' en todos los casos, pero aún puede causar un problema)? –
@Chris: No, esa no es la razón. – kennytm
@KennyTM - Pensé que no, pero aún creo que es un problema. –