gpt4 book ai didi

C++递归模板类型推导

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:13 27 4
gpt4 key购买 nike

我有兴趣学习一些关于模板元编程的知识。在下面的代码中,我尝试使用一些模板递归找到一个足够大以容纳 N 位的无符号整数类型,该类型在编译时指定。

template <typename T>
struct NextIntegralType
{
};

template <>
struct NextIntegralType<void>
{
typedef unsigned char type;
};

template <>
struct NextIntegralType<unsigned char>
{
typedef unsigned short type;
};

...More type 'iteration' here...

template<size_t BITS, typename T>
struct FindIntegralType2
{
typedef std::conditional<BITS <= sizeof(typename T::type)*8, T, FindIntegralType2<BITS, NextIntegralType<typename T::type>>> _type;
typedef typename _type::type type;
};

template<size_t BITS>
struct FindIntegralType
{
typedef typename FindIntegralType2<BITS, NextIntegralType<void>>::type type;
};

当我声明一个变量并为其分配一个整数值时...

FindIntegralType<15>::type test(4000);

我得到以下信息:

error: no matching function for call to ‘FindIntegralType2<15u, NextIntegralType<unsigned char> >::FindIntegralType2(int)’
note: candidates are:
note: constexpr FindIntegralType2<15u, NextIntegralType<unsigned char> >::FindIntegralType2()
note: candidate expects 0 arguments, 1 provided
note: constexpr FindIntegralType2<15u, NextIntegralType<unsigned char> >::FindIntegralType2(const FindIntegralType2<15u, NextIntegralType<unsigned char> >&)
note: no known conversion for argument 1 from ‘int’ to ‘const FindIntegralType2<15u, NextIntegralType<unsigned char> >&’

看来我的递归不是“展开”。谁能指出我正确的方向?

注意:我使用的是 GCC 4.6

编辑:
我找到了一个我之前错过的帖子:
Automatically pick a variable type big enough to hold a specified number

这指向 boost 中的一个答案(它们总是在那里):
boost_integer

这应该可以同时解决我的实际需求和求知欲。

最佳答案

你的问题是_type::type评估为 std::conditional<...>::type , 不是 FindIntegralType2<...>::type .将其更改为 typedef typename _type::type::type type; (太多 type x_X)。这应该可以解决您的问题。

关于C++递归模板类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728842/

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