2009-09-17 2 views
1

는 전화를 걸 중 하나를 포함하는 객체의 비 정적 방법은 식별자를 반환컴파일 타임에 C++의 정적 및 비 정적 메서드를 구분합니까? 인스턴스 전을 식별하는 일부 추적 자동화를위한

  • 항상 동일한 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 
}; 

내가 어떻게 든 (아마도 몇 가지 템플릿 마법을 사용하여) 정적 멤버 함수에 대한 특별한 매크로 같은 작업 차선책을 사용하지 않도록 할 수 있습니까?

+1

저는 함수 포인터를 사용하고 멤버 함수의 경우 바인더를 사용하여이 작업을 수행하는 방법이 있다고 확신합니다. 하지만 처음에는 디자인에 의문을 제기했습니다. 정적 및 비 정적 식별 가능 멤버 함수 모두에 동일한 코드를 작성해야하는 이유는 무엇입니까? "이 문제를 어떻게 해결할 수 있습니까?" "나는 내 문제를 해결하기 위해 이런 방식으로 붙어있다. 어떻게 더 얻을 수 있을까?" – sbi

+0

정적 코드 대신 하나의 중앙 매크로를 사용하고 비 정적 코드를 사용하기 때문에 동일한 코드를 사용하고 싶습니다. 어쩌면 디자인이 올바르지 않을 수도 있지만, 적어도 나 자신은 더 나은 것을 보지 못합니다. –

답변

0

Boost TypeTraits 라이브러리에서 is_member_function_pointer을 사용할 수 있습니다. sbi가 정적 및 비 정적 인 경우에 다른 코드를 사용하는 것이 좋을지도 모른다.

+0

빠른 테스트가 좋은 것처럼 보인다. –

0

예제에서와 같이 각 클래스의 모든 인스턴스마다 다른 식별자가 필요합니까? 아니면 추적에있는 클래스를 식별하려고합니까?

which() 함수 및 _id 멤버를 static으로 변경하면 정적 멤버 함수에 모두 표시되고 보너스로 메모리 사용량이 감소합니다.

+0

예, 저는 같은 클래스의 다른 인스턴스와 그 자식을 식별하기 위해이 작업을 수행합니다. –

+0

그리고 그 경우 정적 인 방법은 무엇이며 왜 같은 몸을 가져야합니까? 그렇지 않으면 a) ident 매크로 (또는 함수)를 무엇을 인쇄할지 (this-> which() 또는 :: which()) 전달하거나 다음과 같이 정적을 구현할 수 있습니다. ident(); } – UncleBens

+0

내 목표는 대부분 "자동"추적/로그 매크로 중 하나의 컬렉션을 사용하는 것이고 특정 상황은 상황에 따라 다릅니다. 이것들은 가능한 한 자동으로 그들이 속한 주 인스턴스를 자동으로 기록해야한다. {using :: which(); ...} 명시 적 메시지를 전달하는 것처럼 단순성 및 자동화의 목표와 모순됩니다. 나를 게으른라고 부르지 만, 내가 어떻게 든 그것을 자동화 할 수 있다면 나는 어떤 맥락에서 생각할 필요가 없다. –

1

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

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

미안하지만, 정적/비 정적 컨텍스트에 대한 다른 코드없이 하나의 중앙 매크로에서 which()를 호출 할 수있는 곳을 볼 수 없습니다. –

+0

죄송합니다. 인스턴스를 식별하는 인수가없는 매크로에 대한 요구 사항을 알지 못했습니다. 내 솔루션을 인수로 인스턴스를 전달해야합니다. –