内部结构在非命名空间作用域中的显式专用化

Explicit specialization _of an inner-struct_ in non-namespace scope

本文关键字:专用 作用域 结构 命名空间 内部      更新时间:2023-10-16

我知道有很多关于">非命名空间作用域中的显式专门化"的帖子;我已经读了其中的大部分,但(除非我没有很好地理解答案(他们没有回答这个特定的问题。事实上,我在我的程序中找到了一个变通方法,但我很想知道这个问题的"真正解决方案"(如果有的话(。

问题

请耐心听我说,这很难用语言表达。我有一个模板类A<typename T, unsigned n>。我想将类型检查器定义为模板内部结构is_A<typename U>,它检查U是否是某个A。此结构按原样继承自std::false_type,并且我将其专门化为从std::true_type派生模板类型A<U,n>

我为什么要这么做?因为我想定义一个模板方法A::method<U>,它在U是某个A或其他情况下表现不同。

什么有效

  1. is_a<U>的非专业化定义置于A的声明之前。然后用2个模板参数而不是1个来放置专门的版本ietemplate <> template <typename T, unsigned n> struct is_A< A<T,n> > : std::true_type {};。为什么不呢,但我不太喜欢添加模板参数,分解is_A的定义也不太好看
  2. 删除is_A并对method使用另一个类型检查器,它精确地描述了我期望的类型(,白名单方法而不是黑名单方法(

除了这些变通方法之外,还有其他方法可以写类似于下面标题的东西吗?

代码

这是我可以写的最小的标题来重现错误:

#ifndef __EXAMPLE__
#define __EXAMPLE__
#include <type_traits>
namespace name
{

template <typename T, unsigned n>
class A
{
public:
    /**
     * Type checkers
     */
    template <typename U>
    struct is_A : public std::false_type {};
    template <> template <typename U>
    struct is_A< A<U,n> > : public std::true_type {};
    /**
     * Specialized method
     */
     // Version taking input of type A<U,n>
    template <typename U>
    void method( const A<U,n>& other ) {}
    // Version taking inputs of other types
    template <typename U,
    typename = typename std::enable_if< !is_A<U>::value >::type >
    void method( const U& x ) {}
};

}
#endif

以下是我编译包含以下标题的cpp文件时遇到的错误:

.h:21:12: error: explicit specialization in non-namespace scope 'class name::A<T, n>'
.h:30:7: error: too many template-parameter-lists
.h:35:7: error: too many template-parameter-lists

如果你按照编译器的建议去做,这似乎对我有用:去掉template<>:

template <typename U>
struct is_A< A<U,n> > : public std::true_type {};