可变参数模板之谜

发布于 2024-12-08 15:56:49 字数 854 浏览 0 评论 0原文

这是运行良好的代码:

template<typename... Args> struct count;

template<>
struct count<> {
static const int value = 0;
};

template<typename T, typename... Args>
struct count<T, Args...> {
static const int value = 1 + count<Args...>::value;
};

现在我想知道为什么我们需要部分专门化计数类模板?

我们可以做类似的事情:

template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %%

template<>
struct dd<>{
static const int value = 0;
};

template<typename T, typename... args> //%%
struct dd{
static const int value= 1+ dd<args...>::value;
};

但这不起作用,但为什么?

非常感谢任何帮助:)

编辑:根据答案编辑解决方案。

Here is the code that works fine :

template<typename... Args> struct count;

template<>
struct count<> {
static const int value = 0;
};

template<typename T, typename... Args>
struct count<T, Args...> {
static const int value = 1 + count<Args...>::value;
};

now i was wondering why we need to partial specialize the count class template?

Can we do something like :

template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %%

template<>
struct dd<>{
static const int value = 0;
};

template<typename T, typename... args> //%%
struct dd{
static const int value= 1+ dd<args...>::value;
};

but this doesn't works but why?

Any help is very appreciated :)

Edit : edited the solution according to answer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人迟暮 2024-12-15 15:56:49
template<>
struct dd<> {
static const int value = 0;
};

不是一种特化,

template< typename T,typename... args> struct dd;

它表示 dd 始终需要至少一个参数。


旁注,已经有一种内置方法来获取可变参数模板参数的数量,并且 count 结构可以实现为

template <class ...args>
struct count
{
    static const int value = sizeof...(args);
};
template<>
struct dd<> {
static const int value = 0;
};

is not a specialization of

template< typename T,typename... args> struct dd;

which says dd will always require at least one parameter.


Sidenote, there already is a built-in way to get the number of variadic template parameters and the count struct could be implemented as

template <class ...args>
struct count
{
    static const int value = sizeof...(args);
};
空气里的味道 2024-12-15 15:56:49

使用 template 您无法创建省略 T 的专业化(即 dd<> ) — 包可以为空,但 T 不能。因此,您将模板声明为仅需要一个包的模板,专门针对空包来停止递归,并部分专门针对 来解压一种类型并创建一个新的类型包装 (n - 1) 种类型。

至于编辑:您不能定义具有不同参数但名称相同的另一个模板,您必须专门化现有的模板。

With template <typename T, typename... Args> you can't create a specialisation that omits T (i.e. dd<>) — the pack can be empty, but T can't. So you declare the template as one that takes only a pack, specialise for empty pack to stop recursion, and partially specialise for <T, Args...> to unpack one type and create a new pack with (n - 1) types.

As for the edit: you can't define another template with different arguments but the same name, you have to specialise the already existing one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文