尝试获取两个回调的签名并生成使用它们每个返回值的回调签名。
给定回调A
and B
=> 生成F
例 1) A:int(char)
B: double(bool)
=> F:双精度(整数)
例 2) A:void(char)
B: 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
's with void
(1), (2), (3)
, the my_fwd
's (4) (5)
失败了,我想了解为什么。
解决办法?!
我找到了一个解决方法,通过专门化my_fwd
for 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;
};
Question
编译器尝试在内部实例化有什么区别
my_fwd< my_func<void(int)>, my_func<void(char)> >
:
-> my_func<void(void)> func
and
the manualmain() 中的版本:my_func<void(void)> my4
?
Was the void
专业化correct修复方法?备择方案?我显然对专业化和代码重复不感兴趣。