C++:静态断言参数包与函数类型匹配
C++: Static assert that a parameter pack matches a function type
给定函数类型 void()
、void(int)
等等...,我们可以 static_assert()
Args&&... args
与函数类型兼容吗?
template <typename F = void(), typename... Args>
auto call(Args&&... args)
{
// TODO: check if F is compatible with Args
if constexpr (std::is_same_v<void, decltype(func(args...))>)
func(std::forward<Args>(args)...);
else
return func(std::forward<Args>(args)...);
}
使用decltype(func(args...))
会报错,但不是最好的报错。此外,static_assert()
是否有可能通过从编译器输出中隐藏这两种类型而使情况变得更糟?
您已经标记了 C++17,所以...使用 std::is_invocable
怎么样?
我假设如下
template <typename F = void(), typename... Args>
auto call (Args && ... args)
{
static_assert( std::is_invocable_v<F, Args...> );
// ...
}
给定函数类型 void()
、void(int)
等等...,我们可以 static_assert()
Args&&... args
与函数类型兼容吗?
template <typename F = void(), typename... Args>
auto call(Args&&... args)
{
// TODO: check if F is compatible with Args
if constexpr (std::is_same_v<void, decltype(func(args...))>)
func(std::forward<Args>(args)...);
else
return func(std::forward<Args>(args)...);
}
使用decltype(func(args...))
会报错,但不是最好的报错。此外,static_assert()
是否有可能通过从编译器输出中隐藏这两种类型而使情况变得更糟?
您已经标记了 C++17,所以...使用 std::is_invocable
怎么样?
我假设如下
template <typename F = void(), typename... Args>
auto call (Args && ... args)
{
static_assert( std::is_invocable_v<F, Args...> );
// ...
}