試圖獲取兩個回調的簽名並生成使用其每個返回值的回調簽名。組合模板參數以形成函數簽名時無效的void參數
鑑於回調A
和B
=>生成F
實施例1)A:int(char)
B:double(bool)
=> F:雙(INT)
實施例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
實例化沒有問題的有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
專業正確解決方法?備擇方案?我顯然對專業化和代碼重複不感興趣。