实施特征实施细节

时间:2019-03-20 19:38:59

标签: c++ c++11 templates traits

最初,我具有一组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;
}

但是它不公开实现细节(通过公共继承)吗?继承私有和代理调用看起来也很愚蠢。还有更优雅的方法吗?

0 个答案:

没有答案