gpt4 book ai didi

c++ - 组合模板参数形成函数签名时无效的 void 参数

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

尝试获取两个回调的签名并生成使用其每个返回值的回调签名。

给定回调 AB =>生成F

例 1) A: int(char)乙:double(bool) => F: 双(整数)

例 2) A: void(char)乙:void(int) => F: 无效(无效)

void 实例化回调时遇到奇怪的编译器错误作为参数:

error: invalid parameter type ‘void’

有问题的代码

template<class Signature>
struct my_func;

template<class Ret, class... Args>
struct my_func<Ret(Args...)>
{};

template<class FuncA, class FuncB>
struct my_fwd;

template<class ORet, class... OArgs,
class Ret, class... Args>
struct my_fwd<
my_func<ORet(OArgs...)>,
my_func<Ret(Args...)>
>
{
my_func< ORet(Ret) > func; // <--- error
};

int main(int, char *[])
{
my_func<void(int)> my3; // (1)
my_func<void(void)> my4; // (2)
my_func<void()> my5; // (3)

my_fwd< decltype(my3), my_func<void(char)> > fwd1; // (4)
my_fwd< decltype(my3), decltype(my4) > fwd2; // (5)

return 0;
}

虽然my_func的实例化没有问题与void (1), (2), (3) , my_fwd(4) (5)失败,我想了解原因。

解决方法?!

我找到了一个解决方法,通过专门化 my_fwd对于 Ret == void :

// with this specialization i can avoid the error
template<class ORet, class... OArgs,
class... Args>
struct my_fwd<
my_func<ORet(OArgs...)>,
my_func<void(Args...)>
>
{
my_func< ORet() > func;
};

问题

编译器试图在内部实例化有什么区别

my_fwd< my_func<void(int)>, my_func<void(char)> > :

-> my_func<void(void)> func

main() 中的手动版本:my_func<void(void)> my4

void专门化正确的修复方法?备择方案?显然,我对特化和代码重复并不感兴趣。

最佳答案

实例化与void的区别作为模板参数并手动编写 void (void)是后者产生一个接受 void 的函数范围。挂牌(void)作为函数的参数是一个语法结构,其含义与 () 相同.这是 C 的遗产,其中 ()表示“参数未指定”和(void)意思是“没有参数”。 C++ 删除了未指定的大小写,并且 ()在那里意味着“没有参数”。

但是,模板实例化发生在句法处理之后很长时间,因此实际上是在尝试实例化函数的参数 (T)T = void导致错误。正如尝试声明一个采用 (std::remove_reference<decltype(std::declval<void*>())>::type) 的函数是错误的一样(即 void 实际上拼写为一种类型)。

恐怕解决这个问题的唯一方法就是专攻 void .

关于c++ - 组合模板参数形成函数签名时无效的 void 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22249882/

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