gpt4 book ai didi

c++ - 非命名空间范围内_内部结构_的显式特化

转载 作者:太空狗 更新时间:2023-10-29 21:24:22 24 4
gpt4 key购买 nike

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

问题

请耐心等待,这很难用语言表达。我有一个模板类 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 个; template <> template <typename T, unsigned n> struct is_A< A<T,n> > : std::true_type {}; .为什么不呢,但我不太喜欢添加模板参数并分解 is_A 的定义也不是很漂亮...
  2. 删除 is_A并为 method 使用另一个类型检查器这正是我期望的类型(,白名单方法而不是黑名单)。

除了这些解决方法之外,还有其他方法可以编写类似于以下 header 的内容吗?

代码

这是我为重现错误而编写的最小 header :

#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

这是我在编译包含此 header 的 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 {};

关于c++ - 非命名空间范围内_内部结构_的显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401040/

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