3

我知道有很多关于“非命名空间范围的显式专业化”的帖子;我已经阅读了其中的大部分内容,但是(除非我没有很好地理解答案)他们没有回答这个特定的问题。事实上,我在我的程序中找到了一种解决方法,但如果有的话,我很想知道这个问题的“真正解决方案”。

问题

请多多包涵,很难用言语表达。我有一个模板类A<typename T, unsigned n>。我想将类型检查器定义为模板内部结构is_A<typename U>,用于检查是否U为 some A。这个结构继承自std::false_type原样,我专门将它派生自std::true_typefor template types A<U,n>

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

什么有效

  1. 将 的非专门定义放在 的is_a<U>声明之前A。然后使用 2 个模板参数而不是 1 个来放置专用版本; template <> 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
4

1 回答 1

3

如果您按照编译器的建议进行操作,这似乎对我有用:省略template<>

template <typename U>
struct is_A< A<U,n> > : public std::true_type {};
于 2013-05-06T14:43:36.053 回答