template-typedef が利用可能になったので、型を変換するクラスに便利なラッパーを提供する必要があるのではないかと考えていました。この(役に立たない)例を考えてみましょう:
template< T >
struct whatever
{
typedef typename std::conditional< sizeof(T) <= sizeof(void*),
int, long >::type type;
};
ここでstd::conditional
はtransform
、 で使用されるタイトルからtypename transform<...>::type
です。また、whatever
それ自体もtransform
同じように使用されます。
template-typedefs (aka using
) が利用可能になったことで、インターフェースを次のように変更できました。
template< T >
using whatever = typename std::conditional< sizeof(T) <= sizeof(void*),
int, long >::type;
これにより、使用が簡素化されます。これはすべてのケースで実行できますが、(部分的な) 特殊化が必要なため、実装クラスとラッパーが必要になる場合があります。の場合、std::conditional
おそらくそれを移動してstd::impl::conditional<...>
、別のラッパーを次のように提供することになります
namespace std
{
namespace impl
{
// "classic" implementation of std::conditional
}
template< bool B, typename T, typename F >
using conditional = typename impl::conditional< B, T, F >::type;
}
これにより、どのインターフェイス/API を提供する必要があるかという疑問が残ります。ラッパーを提供する利点の 1 つは、ユーザー エラーを防止できることです。たとえば、この質問と回答を参照してください。
既存のインターフェイスを維持するために、次の点がわかりました。
- 一貫性。それが型特性であり、基本的に誰もが使用しています
- 変圧器の分離と変換の結果。上記の場合、トランスフォーマーをタイプとして渡すことができますが
whatever
、これはもう不可能です。 impl
特殊化に必要なソリューションを回避することで、コードを削減します。
「私は 2 番目のアプローチの方が好きだ」という意見だけでなく、「新しい」インターフェースを提供することに賛成または反対する議論を聞きたいと思います。いずれかのアプローチが必要な場合、またはそれが機能/スケーリングに失敗した場合について知りたいです。
正直に言うと、質問は主にテンプレート型定義に関する私の経験不足です。実際の経験があれば、その良い面と悪い面、およびtypename transform<...>::type
API を時代遅れと見なすべきかどうかを共有してください。 C++11 かどうか。