是否有一种方法可以使用SFINAE来确定对模板化函数的调用是否会由于所提供的类型而失败

Is there a way to use SFINAE to determine if a call to a templated function would fail due to the types provided?

本文关键字:是否 函数 调用 失败 类型 于所提 一种 方法 SFINAE 可以使      更新时间:2023-10-16

我有一个模板化的类,我正在使用它来提供一个方法,该方法将使用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()的主体将无法编译,这并不会导致替换失败。你能做的最好的事情就是试着预测会导致身体衰竭的情况,就像你已经做过的那样。

相关文章: