gpt4 book ai didi

c++ - 根据参数类型中是否存在 POD 结构成员专门化模板函数

转载 作者:太空狗 更新时间:2023-10-29 20:43:53 36 4
gpt4 key购买 nike

给定一般形式的POD结构

struct case_0   { const char *foo;                       };
struct case_1i { const char *foo; int v0; };
struct case_1d { const char *foo; double v0; };
struct case_2ii { const char *foo; int v0; int v1; };
struct case_2id { const char *foo; int v0; double v1; };
// etc

是否可以根据 v0v1存在或不存在 分派(dispatch)给函数重载集的(模板)成员等数据成员——理想情况下,对这些成员的特定类型有任何依赖——如果是这样,怎么做?具体地,给定

void
process(const case_0& c)
{
do_stuff_with(c.foo);
}

template <typename case_1> void
process(const case_1& c)
{
do_stuff_with(c.foo, c.v0);
}

template <typename case_2> void
process(const case_2& c)
{
do_stuff_with(c.foo, c.v0, c.v1);
}

我希望为所有 case_* 结构选择每个重载,这些结构具有在其主体中使用的所有 v- 成员,并且 - 同样重要 - - 不要有任何v-成员未在其主体内使用。

这个程序必须是 100% 独立的,所以请不要使用 Boost。 C++11 特性没问题。

最佳答案

您需要编写一组特征,例如 has_v0has_v1(我确信已经在 SO 上多次演示)然后使用它们约束您的重载:

template <typename case_0,
typename = typename std::enable_if<!has_v0<case_0>::value>::type,
typename = typename std::enable_if<!has_v1<case_0>::value>::type
>
void
process(const case_0& c)
{
do_stuff_with(c.foo);
}

template <typename case_1,
typename = typename std::enable_if<has_v0<case_1>::value>::type,
typename = typename std::enable_if<!has_v1<case_1>::value>::type
>
void
process(const case_1& c)
{
do_stuff_with(c.foo, c.v0);
}

template <typename case_2,
typename = typename std::enable_if<has_v0<case_2>::value>::type,
typename = typename std::enable_if<has_v1<case_2>::value>::type
>
void
process(const case_2& c)
{
do_stuff_with(c.foo, c.v0, c.v1);
}

你可以用类似的东西简化约束

template<typename Cond>
using Require = typename std::enable_if<Cond::value>::type;

例如

template <typename case_2,
typename = Require<has_v0<case_2>>,
typename = Require<has_v1<case_2>>
>
void
process(const case_2& c)
{
do_stuff_with(c.foo, c.v0, c.v1);
}

关于c++ - 根据参数类型中是否存在 POD 结构成员专门化模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222176/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com