自动模板类enable_if有效参数
auto template class enable_if valid arguments
如果传递到模板中的函数不包含有效参数,我将如何使用enable_if来禁用构造函数。
template <typename SrcType>
using is_Valid_Ret_Type = std::bool_constant<
std::is_same<SrcType, void>::value |
std::is_same<SrcType, int>::value>;
template <typename SrcType>
using is_Valid_Arg_Type = std::bool_constant<
std::is_integral<SrcType>::value /*|
std::is_same<SrcType, float>::value*/>;
template<typename Fn> class FunctionBase;
template<typename R, typename... Args>
class FunctionBase <R(__cdecl*)(Args...)>
{
// ......
};
template <auto F>
class Function : public FunctionBase<decltype(F)> {
public:
template <typename R, typename... Args>
static R return_type_of(R(*)(Args...)) {};
template<
typename = std::enable_if_t<is_Valid_Ret_Type<decltype(return_type_of(F))>::value>,
typename = std::enable_if_t<(is_Valid_Arg_Type<Args>::value&& ...)>> // how do I do this
Function() : FunctionBase<decltype(F)>() { }
};
部分专用化可能会对您有所帮助,与基类大致相同:
template <auto F>
class Function;
template <typename R, typename... Args, R (*F)(Args...)>
class Function<F> : public FunctionBase<decltype(F)> {
public:
static_assert(is_Valid_Ret_Type<R>::value);
static_assert((true && ... && is_Valid_Arg_Type<Args>::value));
Function() : FunctionBase<decltype(F)>() { }
};
您的 SFINAE 尝试也失败了,因为该类已修复条件,产生硬错误而不是 SFINAE。
可以使用帮助程序函数来检查所有参数是否有效。
template <typename R, typename ... Args>
static auto are_args_valid(R(*)(Args...))
{
return std::bool_constant<(true && ... && is_Valid_Arg_Type<Args>::value)>{};
}
在上面的辅助函数中,我使用折叠表达式来检查每个参数类型是否有效。
然后可以在enable_if
内部使用它来检查所有参数是否有效,如下所示
template<
typename = std::enable_if_t<is_Valid_Ret_Type<decltype(return_type_of(F))>::value>,
typename = std::enable_if_t<decltype(are_args_valid(F))::value>>
Function() : FunctionBase<decltype(F)>() { }
这是一个关于 golbolt 的演示。
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 有没有更有效的方法来替换这些多个 IF 语句?
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 在C++中,将"if"放在 for 循环之外还是将"if"放在 for 循环中更有效
- 使用函数指针剪切 if 语句会更有效
- 更有效的是:vector.clear()或if(vector.empty())clear();
- 在同一if语句中检查nullptr和有效索引
- 用c++编写if-then-else语句的更有效方法
- 如何有效地将if和else用于筛选构造
- 评估IF条件的最有效方法是什么?
- 为什么我的第一个 if 语句有效,但我的 else if 语句在它之后不起作用
- 这"if e is a pack, then get a template name, otherwise get a variable name"有效与否?
- 通过hash_map<字符串 fnPtr>调用函数指针是否比C++中的多个 if/else if/else 语句更有效或更好?
- 在没有实际块的if块中有效的声明