gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:30 27 4
gpt4 key购买 nike

我有一个模板类,我正在使用它来提供一种方法,该方法将使用 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 就不会失败。 boost documentation对于 lexical_cast 概述了一些其他要求,我可能也应该检查这些要求,而不是创建复杂的 enable-if 并使用 mpl::and_ 将一堆串在一起这些条件,我想知道:有没有一种方法可以使用 SFINAE 直接测试对 lexical_cast 的调用是否会因给定的类型而失败,并且只有在它不会失败时才匹配专用模板?

我只见过测试函数或运算符是否存在的示例,但从未测试过调用具有给定类型的模板函数是否会产生错误。

最佳答案

恐怕不行。因为 lexical_cast 是为所有 T 定义的,所以 SFINAE 不会帮助你。 lexical_cast() 的主体将无法为某些类型编译的事实不会导致替换失败。您能做的最好的事情就是尝试预测会导致 body 失效的条件,就像您已经在做的那样。

关于c++ - 有没有一种方法可以使用 SFINAE 来确定对模板函数的调用是否会由于提供的类型而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8829764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com