C++ C++;用于专门化联合类型的模板方法

C++ C++;用于专门化联合类型的模板方法,c++,templates,unions,C++,Templates,Unions,假设我有一个工会: union U{ int i; float f; }; 我想编写一个通用方法,将其用作浮点或int。类似如下: template <typename T> T sum(std::vector<U> vec){ T res(0); for (U &v: vec){ res += ... // use v.i or v.f depending on what T is } retur

假设我有一个工会:

union U{
    int i;
    float f;
};
我想编写一个通用方法,将其用作浮点或int。类似如下:

template <typename T>
T sum(std::vector<U> vec){
    T res(0);
    for (U &v: vec){
        res += ... // use v.i or v.f depending on what T is
    }
    return res;
}
模板
T和(标准::向量向量向量){
T(0);
适用于(U&v:vec){
res+=…//根据T是什么使用v.i或v.f
}
返回res;
}

有办法做到这一点吗?这只是一个示例方法。我有一个更长、更复杂的方法,我不想复制它只是为了切换它使用的联合类型。

专门化可以工作:

template <typename T> T const & get(U const &);

template <> int const & get<int>(U const & u) { return u.i; }
template <> float const & get<float>(U const & u) { return u.f; }
template T const&get(U const&get);
模板int const&get(U const&U){return U.i;}
模板float const&get(U const&U){return U.f;}
用法:

for (U & v : vec) { res += get<T>(v); }
(U&v:vec){res+=get(v);}
专业化可以:

template <typename T> T const & get(U const &);

template <> int const & get<int>(U const & u) { return u.i; }
template <> float const & get<float>(U const & u) { return u.f; }
template T const&get(U const&get);
模板int const&get(U const&U){return U.i;}
模板float const&get(U const&U){return U.f;}
用法:

for (U & v : vec) { res += get<T>(v); }
(U&v:vec){res+=get(v);}
你为什么说
typedef
?我忘了你可以在没有typedef的情况下命名工会。你为什么说
typedef
?我忘了你可以在没有typedef的情况下命名工会。有趣;我在想类似的事情。你会说这是做这种事情的最干净的方式吗?@Azmisov:如果你从工会向量(!)开始,我会说我们早就不干净了!有趣;我在想类似的事情。你会说这是做这种事情的最干净的方式吗?@Azmisov:如果你从工会向量(!)开始,我会说我们早就不干净了!