gpt4 book ai didi

c++ - 在模板参数 : Some usage examples and. 中使用 auto .. 如何使其与恒定大小的 C 数组一起使用?

转载 作者:行者123 更新时间:2023-11-28 04:26:10 25 4
gpt4 key购买 nike

我有以下模板参数中 auto 的示例使用(我喜欢独立于它们的理智或存在更好的替代方案,我只是试图内化“模板参数中的自动”功能):

//1-Check if input is within open interval (l, h) where l & h are function parameters
//Example: int x = 5, y = fnc_y(), z = fnc_z(); auto fOk = gt_lt(z, x, y);
template<typename L, typename H, typename V> inline bool
gt_lt(const V &v, const L& l, const H& h) { return (v > l) && (v < h); }

//2-Check if input is within open interval (l, h) where l & h are auto template parameters
//Example: int z = fnc_z(); auto fOk = gt_lt<5, 45>(z);
template<auto l, auto h, typename V>
inline bool gt_lt(const V &v) { return (v > l) && (v < h); }

//3-Fill a C array (a) of known size with a value where a is a function parameter:
// char a[4]; fill_all(a, 'a');
template<typename TArrayValType, size_t N, typename TVal>
inline void fill_all(TArrayValType(&a)[N], const TVal &v) { std::fill(a, a + N, v); }

//4-Fill a C array (a) of known size with a value where a is an auto template parameter
//Can't figure out it!!! Goal: char a[4]; fill_all<a>('a');
template<auto a, **....what else to put it here?**, typename TVal>
inline void fill_all(const TVal &v) { std::fill(a, a + N, v); }

用法 4 不起作用。如何让它发挥作用?我怀疑有类似 Extracting the value of SIZE without knowing its type 的东西会工作,但仍然不能让它工作......

上述用途的一个动机是避免将某些值(当它们在编译时已知时)作为函数参数传递,即使在 Debug模式下也是如此,以获得更好的调试性能,或者希望有时可以从完全优化的构建中受益如果由于非类型参数的 auto 而避免了参数传递,cases compile 将生成更高效的代码。但是,我仍然不确定这是否有意义......

最佳答案

据我所知,你不能这么简单。

如您所见in this page

Array and function types may be written in a template declaration, but they are automatically replaced by pointer to object and pointer to function as appropriate.

所以你可以写

template <auto a, typename TVal>
inline void fill_all(const TVal &v)
{ }

// ...

static int a[4] {};

fill_all<a>(2);

fill_all()a 的类型视为 int *,而不是 int[4].

因此您可以将它用作指针,但您丢失了有关维度的信息。

我能想到的最好的方法是调用一个返回数组大小并将该值作为模板参数(或函数参数)的 constexpr 函数

template <typename T, std::size_t N>
constexpr std::size_t getDim (T const (&)[N])
{ return N; }

template <auto a, std::size_t N, typename TVal>
inline void fill_all (TVal const & v)
{ std::fill(a, a + N, v); }

// ...

static int a[4] {};

fill_all<a, getDim(a)>(2);

但是,不幸的是,我没有找到一种方法来避免在显式模板参数列表中显式调用 getDim()

关于c++ - 在模板参数 : Some usage examples and. 中使用 auto .. 如何使其与恒定大小的 C 数组一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54262558/

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