【发布时间】:2018-10-16 10:36:08
【问题描述】:
我有一堆结构需要添加到我的向量中并给它们一些默认值。
- 结构是外部的,我无法更改它们。
- 在分配这些值时,为了方便起见,我需要查看结构成员名称。
- 为方便起见,我需要将所有默认值直观地显示在同一位置。
- 编译器目前优化了 myClass::addStruct() 中未使用的 if 分支 - 这正是我想要的。
问:能否以更好/更简单的方式完成?
编辑我没有 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>(...);
【问题讨论】:
-
尝试显式模板专业化
-
悬空指针应该/可能/会给你带来问题。为避免,您必须在堆上创建对象。
-
@xaxxon 因为没有 if constexpr 就无法编译;)
-
@Trass3r 如果您将向量的转换放在 if 它应该工作的每个分支中。将任何类型转换为类型 T.. 但只有在正确时才会真正发生。
标签: c++ visual-c++ factory