我想知道随着模板类型定义的可用性,我应该为转换类型的类提供方便的包装器。考虑这个(无用的)示例:
template< T >
struct whatever
{
typedef typename std::conditional< sizeof(T) <= sizeof(void*),
int, long >::type type;
};
这里,std::conditional
来自transform
标题,与 . 一起使用typename transform<...>::type
。此外,whatever
它本身也是 atransform
并以相同的方式使用。
随着模板类型定义(又名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 的问题。我看到了提供包装器的一个优点:它可以防止用户错误。例如,请参阅此问题和答案。
为了保留现有界面,我看到以下几点:
- 一致性。这就是类型特征,基本上每个人都在使用
- 分离变压器和变换的结果。您可以将变压器作为类型传递,在
whatever
上述情况下,这将不再可能。 - 通过防止
impl
专业化所需的解决方案减少代码。
我想听听支持或反对提供“新”界面的论点,而不仅仅是“我更喜欢第二种方法”之类的意见。我有兴趣找出需要一种或另一种方法或它无法工作/扩展的情况。
老实说,问题主要是我缺乏模板类型定义的经验,所以如果你确实有一些实际经验,请分享它的好与坏,以及我是否应该将typename transform<...>::type
API 视为过时的C++11 与否。