如何在模板函数中使用不同的结构作为模板参数?
How can I use different struct as template argument in a template function?
我正在编写这样的模板函数:
template<typename T>
std::string EncodeData(int DataType, T Data, std::string ReadCommandID, std::string& ThisID);
我要使用的类型T
是一些不同的结构,例如:
struct A
{
int A_data;
bool A_data_2;
// etc.......
};
struct B
{
double B_data;
char B_data_2;
// etc.......
};
我希望函数可以访问不同的成员变量取决于传递给T
的不同struct
,所以我写了这样的代码:
template<typename T>
std::string EncodeData(int DataType, T Data, std::string ReadCommandID, std::string& ThisID)
{
if(std::is_same<T, A>{})
{
// Do something with Data.A_data and Data.A_data_2
}
else if(std::is_same<T, B>{})
{
// Do something with Data.B_data and Data.B_data_2
}
// other code.
}
并使用它:
A data={100,false};
std::string id;
std::string result = EncodeData<A>(0,data,"read_id_xxxxxxxx",id);
但是我编译的时候出现了如下错误:
error C2039: "B_data": is not a member of "A".
error C2039: "B_data_2": is not a member of "A".
我该如何解决这个问题?或者我还能做些什么来通过一个函数解决这个问题?
P.S。 我正在使用 MSVC 编译器(Visual Studio 2019)
What else I can do to slove this problom in one single function?
这在 c++11 compiler. However, in C++17 you have if constexpr
下是不可能的:
template<typename T>
std::string EncodeData(int DataType, T const& Data, std::string const& ReadCommandID, std::string& ThisID)
{
if constexpr (std::is_same_v<T, A>)
{
// Do something with Data.A_data and Data.A_data_2
}
else if constexpr (std::is_same_v<T, B>)
{
// Do something with Data.B_data and Data.B_data_2
}
}
对于 C++11,您仍然需要两个函数。因此,我建议为每个函数重载一个函数,这可能比模板更具可读性。
我正在编写这样的模板函数:
template<typename T>
std::string EncodeData(int DataType, T Data, std::string ReadCommandID, std::string& ThisID);
我要使用的类型T
是一些不同的结构,例如:
struct A
{
int A_data;
bool A_data_2;
// etc.......
};
struct B
{
double B_data;
char B_data_2;
// etc.......
};
我希望函数可以访问不同的成员变量取决于传递给T
的不同struct
,所以我写了这样的代码:
template<typename T>
std::string EncodeData(int DataType, T Data, std::string ReadCommandID, std::string& ThisID)
{
if(std::is_same<T, A>{})
{
// Do something with Data.A_data and Data.A_data_2
}
else if(std::is_same<T, B>{})
{
// Do something with Data.B_data and Data.B_data_2
}
// other code.
}
并使用它:
A data={100,false};
std::string id;
std::string result = EncodeData<A>(0,data,"read_id_xxxxxxxx",id);
但是我编译的时候出现了如下错误:
error C2039: "B_data": is not a member of "A".
error C2039: "B_data_2": is not a member of "A".
我该如何解决这个问题?或者我还能做些什么来通过一个函数解决这个问题?
P.S。 我正在使用 MSVC 编译器(Visual Studio 2019)
What else I can do to slove this problom in one single function?
这在 c++11 compiler. However, in C++17 you have if constexpr
下是不可能的:
template<typename T>
std::string EncodeData(int DataType, T const& Data, std::string const& ReadCommandID, std::string& ThisID)
{
if constexpr (std::is_same_v<T, A>)
{
// Do something with Data.A_data and Data.A_data_2
}
else if constexpr (std::is_same_v<T, B>)
{
// Do something with Data.B_data and Data.B_data_2
}
}
对于 C++11,您仍然需要两个函数。因此,我建议为每个函数重载一个函数,这可能比模板更具可读性。