gpt4 book ai didi

c++ - 为什么模板特化在 gcc 中不起作用

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

我想编写类型列表方法来操作微 Controller 的 GPIO。

我想创建 GPIO 列表并仅选择特定端口的引脚。因此,GetPinWithPort 模板具有检查提供的类型的专门化。

template <typename... Ts>
struct tlist
{
using type = tlist;
};

template <typename T> class debug_t;

#define MAKE_PORT(NAME, ID)\
class NAME\
{\
public:\
static void Set(uint32_t v) { };\
static void Reset(uint32_t v) { };\
enum { id = ID };\
};

MAKE_PORT(Porta, 'A');
MAKE_PORT(Portb, 'B');

template <class PORT, uint8_t PIN>
class TPin
{
public:
static void Set() { PORT::Set(1 << PIN); }
static void Reset() { PORT::Reset(1 << PIN); }

typedef PORT port;
enum { pin = PIN };
};

template <class TPort, class T>
struct GetPinWithPort {
using type = tlist<>;
};

template <typename TPort, uint32_t N>
struct GetPinWithPort<TPort, TPin<TPort, N>>
{
using type = TPin<TPort, N>;
};

int main()
{

using pina = GetPinWithPort<Porta, TPin<Porta, 1> >::type;

// std::cout << typeid(pina).name() << std::endl; //Visual Studio gives: class TPin<class Porta,1>
debug_t<pina> d; //gcc output: tlist<>

}

Visual Studio 给出了预期的结果。但是 gcc - 空列表。这里有什么问题?

最佳答案

应该是

template <typename TPort, uint8_t N>  // or auto
struct GetPinWithPort<TPort, TPin<TPort, N>>

不是

template <typename TPort, uint32_t N>
struct GetPinWithPort<TPort, TPin<TPort, N>>

因为(我不是语言律师,这就是我的理解):

template <class PORT, uint8_t PIN>
class TPin {}
// and
using pina = GetPinWithPort<Porta, TPin<Porta, 1> >::type;

在特化 gcc 之间必须做出选择:

class T

TPin<TPort, uint32_t>

它的类型是:

TPin<Porta, 1>

因此可能是 gcc 解析了 TPin<Porta, 1>TPin<Porta, uint8_t>然后特化失败。

关于c++ - 为什么模板特化在 gcc 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56362085/

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