我目前有一个采用一系列类型的类模板。每种类型都可能需要用类本身来实例化。我目前拥有的是这样的:
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
本身会失败。
我知道可以通过执行以下操作来避免 ADL,例如,
MyTypedef *my_ptr = std::addressof(my_object);
(my_free_function)(my_object);
但是,我不想让用户MyClass
不得不不断地抑制 ADL。是否有另一种直接的方法让用户提供类型列表而不将这些类型用于 ADL?