현재 일련의 형식을 사용하는 클래스 템플릿이 있습니다. 각 유형은 클래스 자체로 인스턴스화해야 할 수도 있습니다.템플릿 매개 변수에 대한 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에 사용되는 유형이없는 유형의 목록을 사용자가 제공하게하는 또 다른 직접적인 방법이 있습니까?
명백한 위험이 있으므로 TypeList 및 Placeholder를 정의하면 어떨까요? – rici
나는 이것을 이해할 수 있을지 확신하지 못합니다. * "MyClass는 Placeholder의 외관을 대체하고, 결과 유형을 사용하며, 모두 훌륭합니다."* 의미를 설명 할 수 있습니까? MyClass>의 자리 표시자를 자리 표시자를 참조하는 전체 유형으로 어떻게 바꿀 수 있습니까? –
@rici TypeList를 정의하거나 정의하지 않으면 아무런 차이가없는 것처럼 보입니다. 자리 표시 자 정의 문제는 내가 정의한 것입니다. 일부 템플릿은 빈 구조체와 함께 작동하지 않으며 Placeholder가 MyClass의 전체 인터페이스를 미러링하지 않도록하고 싶습니다. – rkjnsn