如何测试std :: function <t>是否可构造为模板参数T.

时间:2018-02-27 13:22:06

标签: c++ c++11 templates c++14 sfinae

我目前正在编写一个模板类,它采用Signature模板参数并在内部存储std :: function。

template <class Signature>
class Impl
{
    std::function<Signature> f;
};

这似乎工作得很好,除非Signature模板参数无效,编译器在std :: function中出现一些模板实例化错误。

现在因为Impl客户端不需要知道Impl的内部,最好将一些人类可读的消息输出给将使用Impl的同事开发人员说明Signature参数无效。

使用is_invocable特质类,如:

static_assert(is_invocable<Signature>::value, "Template parameter Signature is invalid");

在尝试写这样的特质课时,我想出了这个:

template <class Signature>
struct is_invocable : std::false_type
{};

template <class Signature>
struct is_invocable <std::function<Signature>> : std::true_type
{};

但这似乎不起作用,因为is_invocable不想检查Signature是否是std :: function,而是可以使用{{构造std::function<T> 1}}是模板参数T

如何编写Signature课程?

注意:c ++ 17不可用。

1 个答案:

答案 0 :(得分:3)

在评论中建议StoryTeller,您需要std::is_function,因为您传递给std::function的模板参数必须是签名

template <class Signature>
struct Impl
{
    static_assert(std::is_function<Signature>::value, "");
    std::function<Signature> f;
};

std::function将检查其函数对象是否可以Signature为您调用。