我目前正在编写一个模板类,它采用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不可用。
答案 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
为您调用。