也许它已经被回答或常见的事情,但我错过了一些合适的术语来搜索它。
对于下面的示例代码:
// 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/