当类型名Arg = void时,如何使std :: function <void(arg)>编译?

时间:2018-07-25 07:27:27

标签: c++11 gcc

假设我有一个这样的类型别名:

$x = 0;
foreach ($orderForPayment as $index => $item):

    $items[$x] = new Item();

    $items[$x]->setName($item['name'])
        ->setCurrency('GBP')
        ->setQuantity($item['qty'])
        ->setPrice($item['subtotal']);

    $++;
endforeach;

除了Arg无效的情况外,它都可以正常工作:

template <typename Arg>
using Func = std::function<void(Arg)>;

第二个给出以下编译错误:

Func<int> f1;
Func<void> f2; // doesn't compile

如何为error: invalid parameter type ‘void’using Func = std::function<void(Arg)>; error: in declaration ‘using Func = class std::function<void(Arg)>’ 创建别名?

1 个答案:

答案 0 :(得分:2)

您可以尝试添加一些模板专长:

template<typename T>
struct FuncImpl
{
    using type = std::function<void(T)>;
};

template<>
struct FuncImpl<void>
{
    using type = std::function<void()>;
};

template <typename Arg>
using Func = typename FuncImpl<Arg>::type;

EXAMPLE