首页 > 解决方案 > 执行特征实现细节

问题描述

最初,我有一组特性 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 trait。因此,我需要包含与 StandardTraits 中相同的方法的 NonStandardTraits 包装器。事实证明,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;
}

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

标签: c++c++11templatestraits

解决方案


推荐阅读