最初,我具有一组StandardInfo特性和一个辅助包装模板StandardTraits,这些模板包含许多静态方法,这些方法使用StandardInfo做一些事情:
#include <iostream>
#include <type_traits>
#include <cstdint>
template <std::uint32_t Id>
struct StandardInfo
{ };
template <>
struct StandardInfo<1>
{
using Field1 = std::integral_constant<std::uint32_t, 42>;
};
template <>
struct StandardInfo<2>
{
using Field1 = std::integral_constant<std::uint32_t, 19>;
};
// and more StandardInfo specifications...
template <std::uint32_t Id>
struct StandardTraits
{
using Info = StandardInfo<Id>;
static void DoFoo() { std::cout << Info::Field1::value; }
};
int main()
{
StandardTraits<1>::DoFoo();
return 0;
}
假设我需要介绍另一个非标准类型特征。所有StandardInfo专业化都是自动生成的,我不应该改变这种顺序。因此,我必须介绍NonStandartInfo特性。因此,我需要NonStandardTraits包装器,该包装器包含与StandardTraits中相同的方法。事实证明,StandardTraits和NonStandardTraits仅在Info类型别名上有所不同。复制粘贴实现似乎令人怀疑,因此似乎我需要将包装实现实现为TraitsImpl形式,而不是更改已经使用StandardTraits的现有代码。
#include <iostream>
#include <type_traits>
#include <cstdint>
template <std::uint32_t Id>
struct StandardInfo
{ };
template <>
struct StandardInfo<1>
{
using Field1 = std::integral_constant<std::uint32_t, 42>;
};
template <>
struct StandardInfo<2>
{
using Field1 = std::integral_constant<std::uint32_t, 19>;
};
// and more StandardInfo specifications...
template <std::uint32_t Id>
struct NonStandardInfo
{ };
template <>
struct NonStandardInfo<1>
{
using Field1 = std::integral_constant<int, -1>;
};
template <>
struct NonStandardInfo<2>
{
using Field1 = std::integral_constant<int, -2>;
};
template <typename Info>
struct TraitsImpl
{
static void DoFoo() { std::cout << Info::Field1::value; }
};
template <std::uint32_t Id>
struct StandardTraits: TraitsImpl<StandardInfo<Id> >
{
};
template <std::uint32_t Id>
struct NonStandardTraits: TraitsImpl<NonStandardInfo<Id> >
{
};
int main()
{
StandardTraits<1>::DoFoo();
NonStandardTraits<1>::DoFoo();
return 0;
}
但是它不公开实现细节(通过公共继承)吗?继承私有和代理调用看起来也很愚蠢。还有更优雅的方法吗?