2013-02-08 5 views
3

현재 일련의 형식을 사용하는 클래스 템플릿이 있습니다. 각 유형은 클래스 자체로 인스턴스화해야 할 수도 있습니다.템플릿 매개 변수에 대한 ADL 금지

template <typename... Types> 
struct TypeList; // Not defined 

struct Placeholder; // Not defined 

template <typename Types, typename AnotherType = Default> 
class MyClass 
{ 
    // ... 
}; 

당신은 다음과 같이 사용할 수 있습니다 : : 제가 현재 가지고하면이 같은 것입니다

typedef MyClass<TypeList<Container1<Placeholder>, Container2<std::string, 
     Placeholder>, OtherType>, OptionalType> MyTypedef; 
MyTypedef my_object; 

MyClass이 결과 유형을 사용, 자체 Placeholder의 모습을 대체 할 것이며, 모두가 잘.

MyTypedef *my_ptr = &my_object; 
my_free_function(my_object); 

이 모두가 컴파일러 오류가 발생 컴파일러가 인수 종속 조회를 할 Container1<Placeholder>Container2<std::string, Placeholder>를 인스턴스화하려고하기 때문에, (ADL)을 : 나는이 중 하나처럼 뭔가를하려고 할 때

문제가 발생합니다 ,이 인스턴스는 Placeholder 자체로 실패합니다.

나는

MyTypedef *my_ptr = std::addressof(my_object); 
(my_free_function)(my_object); 

는 그러나, 나는 끊임없이 ADL을 억제하는 데에 부담 MyClass의 사용자가 원하지 않는, 예를 들어, 수행하여 ADL을 방지 할 수있다 알고있다. ADL에 사용되는 유형이없는 유형의 목록을 사용자가 제공하게하는 또 다른 직접적인 방법이 있습니까?

+0

명백한 위험이 있으므로 TypeList 및 Placeholder를 정의하면 어떨까요? – rici

+1

나는 이것을 이해할 수 있을지 확신하지 못합니다. * "MyClass는 Placeholder의 외관을 대체하고, 결과 유형을 사용하며, 모두 훌륭합니다."* 의미를 설명 할 수 있습니까? MyClass >의 자리 표시자를 자리 표시자를 참조하는 전체 유형으로 어떻게 바꿀 수 있습니까? –

+0

@rici TypeList를 정의하거나 정의하지 않으면 아무런 차이가없는 것처럼 보입니다. 자리 표시 자 정의 문제는 내가 정의한 것입니다. 일부 템플릿은 빈 구조체와 함께 작동하지 않으며 Placeholder가 MyClass의 전체 인터페이스를 미러링하지 않도록하고 싶습니다. – rkjnsn

답변

0

좋아, 나는 모든 것이 작동하도록했다. 트릭은 템플릿을 직접 사용하는 대신 종속 형식을 사용하는 것이 었습니다. , MyClass에에,

마지막으로

template <typename... Types> 
struct TypeList 
{ 
private: 
    struct Holder 
    { 
    private: 
     typedef TypeList<Types...> InnerTypeList; 
     template <typename Types, typename AnotherType> 
     friend class MyClass; 
    }; 
public: 
    typedef Holder type; 
}; 

그런 다음, MyClass에의 사용자가

typedef MyClass<TypeList<Container1<Placeholder>, Container2<std::string, 
     Placeholder>::type, OtherType>, OptionalType> MyTypedef; 
MyTypedef my_object; 

주 ': 유형'의 추가 작업을 수행 할 수 있습니다 다음과 같이 내 최종 솔루션은 TypeList을 정의하는 것이 었습니다 나는

typedef typename SubstituteType<Types, Placeholder, MyClass>::type InternalTypeList; 

교체

typedef typename SubstituteType<Types::InnerTypeList, Placeholder, MyClass>::type 
     InternalTypeList; 

전과 같이 InternalTypeList에 대해 동일한 유형을 제공합니다.

종속 형식 Holder에는 자체의 템플릿 매개 변수가 없기 때문에 컴파일러는 ADL 용도로 자리 표시 자 유형을 인스턴스화 할 필요가 없으며 모든 것이 제대로 작동합니다.

관련 문제