gpt4 book ai didi

c++ - 在具有运行时参数和编译时参数的类之间共享代码

转载 作者:行者123 更新时间:2023-11-30 03:16:01 24 4
gpt4 key购买 nike

考虑一个模拟关联缓存的类:

template <size_t S, size_t L, size_t W>
class AssociativeCache {
size_t which_set(size_t index) { return index % (L * W); }
// ...
};

这里,关键缓存参数S , LW是编译时非类型模板参数。

也可以像这样实现一个类似的类:

class AssociativeCacheDynamic {
size_t S, L, L;
size_t which_set(size_t index) { return index % (L * W); }
// ...
};

这里,关键参数与其他情况相同,但存储为类的成员变量。

除了在动态情况下设置缓存参数值的构造函数外,两个类的每个方法的实现也基本相同,即源代码是逐字节相同的1

如果我想要这两个这些类,我怎样才能以最少的代码重复和尽可能少的粗鲁宏或多个包含 hack 来实现它们?

如果解决方案允许您有一些差异,则加分:例如,模板方法可能使用 std::array存储和动态可能使用std::vector .


1 尽管编译后的代码通常会完全不同(因为代码不是专门针对动态情况下的固定值)。

最佳答案

诀窍是提出基类来封装两种形式之间的差异,同时允许派生模板类拥有共同的功能。像这样的东西:

#include <vector>

template <size_t Sp, size_t Wp, size_t Lp>
class AssociativeCacheTemplate {
protected:
static constexpr size_t S = Sp;
static constexpr size_t W = Wp;
static constexpr size_t L = Lp;
AssociativeCacheTemplate() { }
};

class AssociativeCacheDynamic {
protected:
size_t S;
size_t W;
size_t L;
public:
AssociativeCacheDynamic(size_t Sp, size_t Wp, size_t Lp): S(Sp), W(Wp), L(Lp) { }
};

template <class T>
class AssociativeCache: T {
using T::L;
using T::W;
using T::S;
public:
using T::T;
size_t which_set(size_t index) const { return index % (L * W); }
};

int test() {
AssociativeCache<AssociativeCacheTemplate<2, 16, 32>> t;
AssociativeCache<AssociativeCacheDynamic> d(2, 16, 32);
return t.which_set(3) * d.which_set(2);
}

模板库中的static constexpr 允许模板值在代码中用作常量,而不占用任何内存。只要大小变量 SWL 在两个碱基之间相同,使用AssociativeCache 类中的语句将能够访问两个基类值。

AssociativeCacheDynamic 构造函数的 public 是编译它所必需的。

关于c++ - 在具有运行时参数和编译时参数的类之间共享代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622672/

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