gpt4 book ai didi

c++ - 内部模板类的递归特化结束

转载 作者:行者123 更新时间:2023-11-30 03:51:42 25 4
gpt4 key购买 nike

考虑这个工作代码:

#include <typeinfo>

template <typename ...> struct A;

template <typename First, typename... Rest>
struct A<First, Rest...> {
static void execute() {
std::cout << typeid(First).name() << ' ';
A<Rest...>::execute();
}
};

template <>
struct A<> {
static void execute() {} // End of recursion.
};

int main() {
A<char, bool, int>::execute(); // char bool int
}

那么为什么下面的递归结尾编译不通过(错误语句在注释中提供):

#include <typeinfo>

template <typename ...> struct A;

template <typename... Ts>
struct A {
template <typename...> struct B;
template <typename...> static void execute();
};

template <typename... Ts>
template <typename First, typename... Rest>
struct A<Ts...>::B<First, Rest...> {
static void execute() {
std::cout << typeid(First).name() << ' ';
B<Rest...>::execute();
}
};

template <typename... Ts>
template <> // invalid explicit specialization before '>' token
struct A<Ts...>::B<> { // template parameters not used in partial specialization: Ts
static void execute() {} // End of recursion
};

template <typename... Ts>
template <typename... Us>
void A<Ts...>::execute() {
B<Ts..., Us...>::execute();
}

int main() {
A<char, bool, int>::execute<double, short, float>();
}

当我使用这个递归结束而不是上面时它确实有效:

template <typename... Ts>
template <typename Last>
struct A<Ts...>::B<Last> {
static void execute() {std::cout << typeid(Last).name();}
};

但我只想知道最初的尝试有什么问题。此外,我必须使用第二种方式重复 execute() 函数的主体(这当然​​会导致更多的维护责任)。

GCC 4.9.2 指出 A<char, bool, int>::B<>是一个不完整的类型。但我定义了它。

最佳答案

[temp.expl.spec]/p15 禁止显式特化成员模板而不显式特化每个封闭模板:

A member or a member template may be nested within many enclosing class templates. In an explicit specialization for such a member, the member declaration shall be preceded by a template<> for each enclosing class template that is explicitly specialized. [ Example:

template<class T1> class A {
template<class T2> class B {
void mf();
};
};
template<> template<> class A<int>::B<double>;
template<> template<> void A<char>::B<char>::mf();

— end example ]

例如,这段代码编译:

template <>
template <>
struct A<>::B<> {
static void execute() {} // End of recursion
};

但它不允许您使用封闭类模板中的模板参数。一个更好的方法是在主模板中使用包扩展“技巧”:

template <typename... Ts>
template <typename... Args>
struct A<Ts...>::B {
static void execute() {
using unpack = int[];
(void)unpack{((std::cout << typeid(Args).name() << ' '), 0)...};
}
};

关于c++ - 内部模板类的递归特化结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31128159/

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