c++ - 从模板中使用的结构类型中查找类型(可能是底层的)

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

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

对于下面的示例代码:

// 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<SignsEnum , std::array<SignsEnum, 10>> objSignsProc;

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

问题是:模板参数太多(而且看起来多余)

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

谢谢

编辑(附加场景):

对于这种情况,如果数组元素是一个结构,并且结构元素的 noe 具有 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 = {{.....}};

最佳答案

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

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);
};

关于c++ - 从模板中使用的结构类型中查找类型(可能是底层的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634846/

相关文章:

pointers - 如何将* uint64和* uint32数据类型转换为int数据类型?

c++ - HID 上的 Readfile 有时会给出错误的值

c++ - 模板类中友元声明的附加模板参数?

C++ 求 vector vector 中的最大值

c++ - 如何将 uint16_t 转换为宽字符串 (std::wstring)

c++ - decltype 和括号答案是错误的?

c++ - 在 Linux 上原子写入文件

C++14 编译时 std::array 与可变参数模板

C# 将 ReadOnlyCollection<int> 转换为 byte[] 数组

javascript - 字符串 'null' 、 'true' 、 'false' 等到 JS 中的实际 null、true 和 false