문제

인스턴스를 식별하기위한 일부 추적 자동화의 경우 다음 중 하나를 호출하려고합니다.

  • 포함 된 물체의 비 정적 메소드는 식별자를 반환합니다.
  • 항상 같은 ID를 반환하는 다른 것

내 현재 솔루션은 ()와 객체의 맥락에서 사용되지 않으면 사용해야하는 ()의 방법이있는 기본 클래스를 갖는 것입니다. 그러나 이것은 정적 멤버 함수에 대해서는 작동하지 않으며 여기서는 컴파일러가 글로벌 방법보다 비 정적 메소드를 선호합니다.

단순화 된 예 :

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
};

어떻게 든 정적 멤버 기능을위한 특수 매크로와 같은 작업 어라운드를 사용하지 않아도 될 수 있습니까?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 is_member_function_pointer Boostraits 라이브러리에서. 정적 및 비 정적 사례에서 다른 코드를 사용하겠다는 SBI의 제안은 아마도 더 나을 것입니다.

다른 팁

모든 유형의 기본 식별자를 반환하는 함수 템플릿을 정의하십시오.

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

특정 클래스의 함수 템플릿을 전문화하십시오.

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(); }

식별하려는 인스턴스를 전달하여 함수 템플릿을 호출하십시오.

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

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

    return 0;
}

예제에서와 같이 각 클래스의 모든 인스턴스에 대해 다른 식별자가 필요합니까, 아니면 추적에 어떤 클래스인지 식별하려고합니까?

Whet () 함수 및 _id 멤버를 정적으로 변경하면 정적 멤버 기능에 노출되며 보너스로 인해 메모리 사용량이 줄어 듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top