gpt4 book ai didi

c++ - 我如何处理未调用的函数的不需要的模板实例化?

转载 作者:太空狗 更新时间:2023-10-29 19:58:01 24 4
gpt4 key购买 nike

我正在尝试实现一些代码,我想在其中调用基于类型特征的某些模板化方法。不幸的是,这些方法是用与函数不兼容的类型(从未用所述类型调用的)实例化的,这会导致编译错误。理想情况下,我可以使用这些特征来防止实例化所述未调用的方法,但事实并非如此,因此我正在寻找可以使用的解决方法或设计模式。

我有一些简单的 POD 结构。每种类型都有不同的成员(它们的存在由相应的特征表示)

struct ThingA
{
int a;
};

struct ThingAB
{
int a;
int b;
};

struct ThingABC
{
int a;
int b;
int c;
};

template <typename Thing>
struct ThingTraits
{
static const bool has_a=false;
static const bool has_b=false;
static const bool has_c=false;
};

这是模板函数; ThingA、ThingAB 和 ThingABC 可以作为 Src 或 Dst 类型传递给它

template<typename Src, typename Dst>
void assign(Src const &src, Dst &dst)
{
constexpr bool c_a = ThingTraits<Src>::has_a && ThingTraits<Dst>::has_a;
constexpr bool c_b = ThingTraits<Src>::has_b && ThingTraits<Dst>::has_b;
constexpr bool c_c = ThingTraits<Src>::has_c && ThingTraits<Dst>::has_c;

c_a ? copy_a(src,dst) : do_nothing();
c_b ? copy_b(src,dst) : do_nothing();
c_c ? copy_c(src,dst) : do_nothing();
}

copy_a/b/c 方法只是复制相应的成员:

template<typename Src, typename Dst>
void copy_a(Src const &src, Dst &dst)
{
dst.a = src.a;
}

template<typename Src, typename Dst>
void copy_b(Src const &src, Dst &dst)
{
dst.b = src.b;
}

template<typename Src, typename Dst>
void copy_c(Src const &src, Dst &dst)
{
dst.c = src.c;
}

当试图编译它时,我得到了错误,因为 copy_a/b/c 是为所需成员不存在的类型(即 copy_b)实例化的。

既然这种方式实际上行不通,我该如何实现功能上等效的东西?我需要 ThingA、AB、ABC 保持简单的 POD,没有额外的成员(大小要求是严格的),我不想确定在运行时调用哪些复制操作。

最佳答案

你可能有这样的东西:

template<bool hasA>
struct copy_a_caller
{
template <typename Src, typename Dst>
void operator () (const Src& src, Dst& dst) const
{
dst.a = src.a;
}
};

template<>
struct copy_a_caller<false>
{
template <typename Src, typename Dst>
void operator () (const Src&, Dst&) const {}
};

template<typename Src, typename Dst>
void copy_a(Src const &src, Dst &dst)
{
copy_a_caller<ThingTraits<Src>::has_a && ThingTraits<Dst>::has_a>()(src, dst);
}

// similar thing for b and c

然后

template<typename Src, typename Dst>
void assign(Src const &src, Dst &dst)
{
copy_a(src, dst);
copy_b(src, dst);
copy_c(src, dst);
}

关于c++ - 我如何处理未调用的函数的不需要的模板实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244424/

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