[英]How to assign struct values in a template class function?
我有一堆结构需要添加到我的矢量并给它们一些默认值。
问:可以用更好/更简单的方式完成吗?
编辑我没有C ++ 17
//外部结构
typedef struct A {
int member1;
float member2;
char *member3;
// ...
} A;
typedef struct B {
double member5;
float member3;
int *member4;
// ...
} B;
typedef struct C {
char* member5;
char* member2;
float *member3;
// ...
} C;
...
template <class T>
void myClass::addStruct(std::vector<T> &vp)
{
void *sp = nullptr;
if(std::is_same<T, A>::value) {
A s{};
s.member1 = 2;
s.member3 = "whatever";
sp = &s;
}
else if(std::is_same<T, B>::value) {
B s{};
s.member4 = nullptr;
s.member3 = 3.1f;
sp = &s;
}
else if(std::is_same<T, C>::value) {
C s{};
s.member2 = "whenever";
sp = &s;
}
/* else if() {
}
else if() {
} ...
*/
if(sp == nullptr) {
// print error
return;
}
vp.push_back(*(reinterpret_cast<T*>(sp)));
}
// usage
addStruct<A>(...);
addStruct<A>(...);
addStruct<B>(...);
addStruct<C>(...);
#include <vector>
typedef struct A {
int member1;
float member2;
const char *member3;
// ...
} A;
typedef struct B {
double member5;
float member3;
int *member4;
// ...
} B;
typedef struct C {
char* member5;
char* member2;
float *member3;
// ...
} C;
template <class T>
void addStruct(std::vector<T> &vp)
{
// print error
}
template <>
void addStruct<A>(std::vector<A> &vp)
{
A s{};
s.member1 = 2;
s.member3 = "whatever";
vp.push_back(s);
}
template <>
void addStruct<B>(std::vector<B> &vp)
{
B s{};
s.member4 = nullptr;
s.member3 = 3.1f;
vp.push_back(s);
}
// ...
Trass3r之后的UPD:
#include <vector>
typedef struct A {
int member1;
float member2;
const char *member3;
// ...
} A;
typedef struct B {
double member5;
float member3;
int *member4;
// ...
} B;
typedef struct C {
char* member5;
char* member2;
float *member3;
// ...
} C;
void addStruct(std::vector<A> &vp)
{
A s{};
s.member1 = 2;
s.member3 = "whatever";
vp.push_back(s);
}
void addStruct(std::vector<B> &vp)
{
B s{};
s.member4 = nullptr;
s.member3 = 3.1f;
vp.push_back(s);
}
// ...
创建工厂方法:
template <typename T> struct Tag {};
A MakeDefault(Tag<A>) {
A a{};
a.member1 = 2;
a.member3 = "whatever";
return a;
}
B MakeDefault(Tag<B>) {
B b{};
b.member4 = nullptr;
b.member3 = 3.1f;
return b;
}
C MakeDefault(Tag<C>) {
C c{};
c.member2 = "whenever";
return c;
}
// ...
template <class T>
void myClass::addStruct(std::vector<T> &vp)
{
vp.push_back(MakeDefault(tag<T>{}));
}
我使用标签调度而不是模板专业化,这在这里看起来更简单。
问:可以用更好/更简单的方式完成吗?
是的:通过使用功能多态(具有相同名称和不同参数的函数),可以在没有模板的情况下完成。
typedef struct A {
int member1;
float member2;
char *member3;
// ...
} A;
typedef struct B {
double member5;
float member3;
int *member4;
// ...
} B;
...
void myClass::addStruct(std::vector<A>& v)
{
v.push_back({0});
v.back().member1 = 2;
v.back().member3 = "whatever";
}
void myClass::addStruct(std::vector<B>& v)
{
v.push_back({0});
// v.back().member4 = nullptr; // this is unnecessary now
v.back().member3 = 3.1f;
}
...
// usage
std::vector<A> va;
std::vector<B> vb;
myClass c;
c.addStruct(va);
c.addStruct(vb);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.