【问题标题】:Finding a type (maybe underlying) from a structure type for the usage in templates从结构类型中查找类型(可能是底层)以在模板中使用
【发布时间】:2019-09-02 05:28:42
【问题描述】:

也许它已经被回答或常见的事情,但我错过了一些适当的术语来搜索它。

对于下面的示例代码:

// In a separate file
enum class SignsEnum : uint32_t
{
    S1 = 0,
    S2,
    S3
};

std::array<SignsEnum, 10> arrayMyEnum1 = {{.....}};


// other template class file
template<typename ENUM_T, typename ARRAY_T>
class SignsProc
{

    int32_t SignConvrsn(ENUM_T InSign)
    {
    }

    int32_t ProcData(ARRAY_T& InData)
    {}

}

模板类将使用来自上述示例枚举和数组类型的模板参数进行实例化:

例如SignsProc&lt;SignsEnum , std::array&lt;SignsEnum, 10&gt;&gt; objSignsProc;

实际上,我可能需要再向类的模板参数传递 4-5 个类型。而,例如在上面的示例中,array 将“SignsEnum”类型的对象作为数组元素保存。现在,此类型再次作为第一个模板参数传递,因此函数 (SignConvrsn) 可以像上面的示例中那样定义。那么,是否有可能以某种方式找到并使用数组类型中的“SignsEnum”类型,而不必单独传递它?

问题是:模板参数太多(而且似乎是多余的)

目的是:减少模板参数的数量

谢谢

编辑(附加场景):

如果在这种情况下,数组元素是一个结构,并且该结构元素中没有一个是SignsEnum类型,那么是否可以从中提取“SignsEnum”类型?

// In a separate file
enum class SignsEnum : uint32_t
{
    S1 = 0,
    S2,
    S3
};

struct SignsConfig
{
    SignsEnum sign;
    int32_t config1;
    int32_t config2;
}

std::array<SignsConfig, 10> arrayMyEnum1 = {{.....}};

【问题讨论】:

  • std::array 暴露了 value_type 特征;这就是你要找的东西吗?
  • ARRAY_T 是否总是某种std::array
  • value_type 绝对有帮助!目前,总会有一些数组。但是又出现了一种情况。如果数组元素是某个结构,并且该结构包含类型“SignsEnum”。那么是否可以提取该类型?
  • 关于查找初始化数组的结构类型,我将使用 "decltype(ARRAY_T::value_type::sign)" .. 所以,我想我得到了答案。谢谢。

标签: c++ c++11 type-conversion underlyingtype


【解决方案1】:

您可以更改您的工具以使用专业化:

template <typename ARRAY_T> class SignsProc;

template <std::size_t N, typename T>
class SignsProc<std::array<T, N>>
{
public:
    int32_t SignConvrsn(T InSign);
    int32_t ProcData(std::array<T, N>& InData);
};

或使用类型中提供的别名:

template <typename ARRAY_T>
class SignsProc
{
    using E = typename ARRAY_T::value_type;
public:
    int32_t SignConvrsn(E InSign);
    int32_t ProcData(ARRAY_T& InData);
};

【讨论】:

  • 您确定您没有提交未完成的答案吗? :)
  • @SergeyA:按 Tab 然后输入而不是 Ctr+K 来缩进:-/
【解决方案2】:

您有两个选择来减少参数的数量:

  1. 选项 1. 传递数组模板参数并使用 ARRAY::value_type 提取元素类型
  2. 选项 2。如果容器始终是特定大小的数组,则传递元素类型并从中构造数组类型。

【讨论】:

  • 谢谢! value_type 绝对有帮助。我有另一种情况,如果数组元素是某个结构并且该结构的一个元素是“SignsEnum”。是否有可能将其从结构中提取出来。我将在问题中添加示例场景
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多