c++ - 执行特征实现细节
问题描述
最初,我有一组特性 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;
}
但是它不会暴露实现细节(通过公共继承)吗?继承私有和代理调用看起来也很愚蠢。有没有更优雅的方法?
解决方案
推荐阅读
- r - 在 R 中创建具有相似模式的新列
- javascript - 如何消除导航栏上图像幻灯片的重叠?
- c - 我该如何纠正这种内存泄漏?
- c++ - 将 sprintf 更改为字符数组 C++
- python - Django / Visual Studio 类没有对象错误
- python - 在 Python 中返回占位符
- arrays - 指向数组 int (*ptr)[] 的指针
- c# - 来自 grpc AsyncServerStreamingCall 的高 CPU 使用率
- android-jetpack-compose - 在 DrawScope 中绘制文本 - Jetpack Compose Desktop
- node.js - Express 应用程序中的随机 socket.io 请求