首页 > 解决方案 > 如何在模板类函数中分配结构值?

问题描述

我有一堆结构需要添加到我的向量中并给它们一些默认值。

  1. 结构是外部的,我无法更改它们。
  2. 在分配这些值时,为了方便起见,我需要查看结构成员名称。
  3. 为了方便起见,我需要将所有默认值直观地放在同一个地方。
  4. 编译器目前优化了 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>(...);

标签: c++visual-c++factory

解决方案


  1. 这样的代码甚至不应该编译,除非你使用 if constexpr(又名“静态 if”)。它只会“起作用”,因为您破坏了类型系统(整个 void* 和 reinterpret_cast 舞蹈)。类型别名规则适用。
  2. 您正在获取已经超出范围的对象的地址。那是未定义的行为,现在工作时可能会在更改代码或编译器或只是编译器版本时随时中断。
  3. 如果您真的想使用该代码,为什么不为不同类型创建非模板重载?容易多了。

推荐阅读