是否有一种方法可以使用SFINAE来确定对模板化函数的调用是否会由于所提供的类型而失败
Is there a way to use SFINAE to determine if a call to a templated function would fail due to the types provided?
我有一个模板化的类,我正在使用它来提供一个方法,该方法将使用boost::lexical_cast
将其std::string
参数强制转换为模板中指定的类型,前提是词法强制转换是可能的。目前,为了检查是否可能,我只是检查是否为所讨论的类型定义了operator>>
。这里有一个人为的例子,基本上说明了我在做什么:
template <typename ArgType, class Enable = void>
MyHelperClass
{
void Foo (ArgType arg&, std::string strArg) { } // not castable; do nothing
};
template <typename ArgType>
MyHelperClass<ArgType, boost::enable_if<boost::has_right_shift<std::istream, ArgType> >::type>
{
void Foo (ArgType arg&, std::string strArg) {
arg = boost::lexical_cast<ArgType>(strArg); // cast string arg to ArgType
}
};
到目前为止,这对我的代码来说很好:所有词法转换失败的类型最终都是第一个版本,所有其他类型最终都会是第二个版本,至少对于我的代码正在使用它的类型来说是这样。我担心的是,我基本上假设只要目标类型是InputStreamable,那么lexical_cast就不会失败。lexical_cast的boost文档概述了一些其他需求,我可能也应该检查这些需求,但我不想创建一个复杂的enable-if
并使用mpl::and_
将这些条件串在一起,我想知道:有没有一种方法可以使用SFINAE直接测试对lexical_cast
的调用是否会失败,并且只有在不会失败的情况下才匹配专用模板?
我只见过测试函数或运算符存在性的例子,但从未见过测试对给定类型的模板函数的调用是否会产生错误的例子。
恐怕不行。因为lexical_cast是为所有T定义的,所以SFINAE对您没有帮助。对于某些类型,lexical_cast()的主体将无法编译,这并不会导致替换失败。你能做的最好的事情就是试着预测会导致身体衰竭的情况,就像你已经做过的那样。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 函数作为模板参数,是否对返回类型强制约束
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 函数是否可以访问传递给main()的参数
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 在这种情况下,java对象是否可以调用本机函数
- 检查函数返回类型是否与STL容器类型值相同
- 根据某个函数是否存在启用模板
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 无论如何,我可以确定构造函数是否存在吗?
- 是否可以将函数导入命名空间,但不能导出它?
- 返回指向对象的指针的函数调用是否为 prvalue?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本