问题:
确定类成员的版本应基于类的模板参数调用函数可能具有挑战性。使用enable_if可以是一个解决方案,但可能会遇到“struct std::enable_if'中没有名为'type'的类型”之类的错误。
解决方案:
问题在于模板参数的替换。 enable_if 的工作原理是消除在模板参数替换期间导致错误的重载。在提供的代码中,不会发生替换,因为在成员函数实例化时 T 已知。
要解决此问题,请创建一个默认为 T 的虚拟模板参数,并将其用于 SFINAE(替换失败不是一个错误)。将有问题的代码替换为以下内容:
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
注意:
为了防止用户显式指定模板参数并可能获得不正确的结果,您可以添加静态对成员函数的断言,如以下示例所示:
<code class="cpp">template<typename T> struct Point { template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is int." << std::endl; } template<typename... Dummy, typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!"); std::cout << "T is not int." << std::endl; } };</code>
以上是如何使用enable_if根据模板参数选择函数:为什么会出现'struct std::enable_if”中没有类型名为'type”的错误以及如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!