Pregunta

Para algunas automatizaciones de rastreo para identificar instancias, quiero llamar:

  • un método no estático del objeto contenedor que devuelve su identificador
  • algo más que siempre devuelve la misma identificación

Mi solución actual es tener una clase base con un método which () y una función global which () que debería usarse si no en el contexto de un objeto. Sin embargo, esto no funciona para funciones miembro estáticas, aquí el compilador prefiere el método no estático sobre el global.

Ejemplo simplificado:

class IdentBase
{
public:
  Ident(const std::string& id) _id(id) {}
  const std::string& which() const { return _id; }
private:
  const std::string _id;
};

const std::string& which() { static const std::string s("bar"); return s; }

#define ident() std::cout << which() << std::endl

class Identifiable : public IdentBase
{
public:
  Identifiable() : Ident("foo") {}
  void works() { ident(); }
  static void doesnt_work() { ident(); } // problem here
};

¿Puedo evitar de alguna manera usar soluciones alternativas como una macro especial para funciones miembro estáticas (tal vez usando algo de magia de plantilla)?

¿Fue útil?

Solución

Es posible que pueda usar is_member_function_pointer de la biblioteca Boost TypeTraits. Sin embargo, la sugerencia de sbi de usar un código diferente en los casos estáticos y no estáticos es probablemente mejor.

Otros consejos

Defina una plantilla de función que devuelva un identificador predeterminado para todos los tipos.

template<typename T>
const std::string& which(const T& object)
{ static const std::string s("bar"); return s; }

Especialice la plantilla de función para la clase específica.

class IdentBase
{
public:
    IdentBase(const std::string& id): _id(id) {}
    const std::string& id() const { return _id; }
private:
    const std::string _id;
};

template<>
const std::string& which(const IdentBase& object)
{ return object.id(); }

Llame a la plantilla de función pasando una instancia que desee identificar.

int main()
{
    int i;
    std::cout << which(i) << std::endl;

    IdentBase foo("foo");
    std::cout << which(foo) << std::endl;

    return 0;
}

¿Necesita un identificador diferente para cada instancia de cada clase como en su ejemplo, o simplemente está tratando de identificar qué clase está en la traza?

Cambiar su función which () y _id member a static los expondría a ambos a sus funciones miembro static y, como beneficio adicional, disminuiría su uso de memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top