現在、一連の型を取るクラス テンプレートがあります。各タイプは、クラス自体でインスタンス化する必要がある場合があります。私が現在持っているものは次のようなものです:
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 に型を使用せずに、ユーザーに型のリストを提供させる別の簡単な方法はありますか?