2016-09-06 3 views
2

일반 인터페이스를 작성하고 싶습니다. std :: vector에서 다른 객체 목록이 필요합니다. 이 오브젝트 각각은 다른 유형이지만 인터페이스는 동일합니다. 예를 들어다른 유형의 일반 인터페이스

:

struct Base 
{ 
    std::string name; 

    virtual void doWork(???, ???); 
    virtual void print(???,???); 
}; 

struct ObjA : Base 
{ 
    void doWork(???,???) override 
    { 
     std::cout << "Hello\n"; 
    }; 
    void print(???,???) override 
    { 
    std::cout << "Hey\n"; 
    }; 
} 

struct ObjB : Base 
{ 
void doWork(???,???) override { std::cout << "Hello\n"; }; 
void print(???,???) override { std::cout << "Hey\n"; }; 
} 

하지만 ???의 유형을 모르는, ???. 템플릿과 함께 가상을 사용할 수 없기 때문에 나는 우아한 방법을 찾고 있습니다.

컴파일시이를 해결할 수 있습니까?

+2

의도 한 용도에 대한 구체적인 예를 하나 이상 제공하십시오. 당분간은 (그러한 예문이없는) 명확하지 않은 것으로 결론 지었다. –

답변

1

. 에서 Base는 전달할 인수의 수를 정수로 전달한 다음 가변 인수를 전달합니다. 그런 다음 va_arg를 사용하여 실제 매개 변수를 가져옵니다. 그들은 또한 당신의 방법에 대한 유용한 정보를 제공하기위한 공통 인터페이스를 공유 할 필요가 같은

struct Base 
{ 
    std::string name; 

    virtual void doWork(int i, ...) 
    { 
    } 
}; 

struct ObjB : Base 
{ 
    void doWork(int i, ...) override 
    { 
     va_list ap; 

     va_start(ap, i); 

     int x = va_arg(ap, int); 

     std::cout << x << std::endl; 

     float f = va_arg(ap, float); 

     std::cout << x << std::endl; 

     va_end(ap); 
    } 
}; 

Base *base = new ObjB; 

base->doWork(2, 10, 3.f); 
0

이 질문은 중복 된 것으로 표시 될 수 있습니다. 하지만 당신이 진술했기 때문에 : "가능하지 않기 때문에 ...." 그리고 "컴파일시 이것을 해결할 수 있습니까?"

이 답변을 참조하십시오 : 당신은 변수 인수와 함께이 작업을 수행 할 수

Can a C++ class member function template be virtual?

0

귀하의 알 수없는 매개 변수 유형 (???) 냄새.

이렇게하면 문제가 우아한 방식으로 해결되지만 컴파일시에는 분명히 해결되지 않습니다.

관련 문제