我知道有很多关于“非命名空间范围的显式专业化”的帖子;我已经阅读了其中的大部分内容,但是(除非我没有很好地理解答案)他们没有回答这个特定的问题。事实上,我在我的程序中找到了一种解决方法,但如果有的话,我很想知道这个问题的“真正解决方案”。
问题
请多多包涵,很难用言语表达。我有一个模板类A<typename T, unsigned n>
。我想将类型检查器定义为模板内部结构is_A<typename U>
,用于检查是否U
为 some A
。这个结构继承自std::false_type
原样,我专门将它派生自std::true_type
for template types A<U,n>
。
我为什么要这样做?因为我想定义一个模板方法,它在某些或其他情况A::method<U>
下表现不同。U
A
什么有效
- 将 的非专门定义放在 的
is_a<U>
声明之前A
。然后使用 2 个模板参数而不是 1 个来放置专用版本;即template <> template <typename T, unsigned n> struct is_A< A<T,n> > : std::true_type {};
。为什么不呢,但我不太喜欢添加模板参数,并且爆炸的定义is_A
也不那么漂亮...... - 删除
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