使用不同的enable_if条件选择成员函数
enable_if元函数用于指定模板函数参数并根据它们选择合适的成员函数。考虑以下代码:
<code class="cpp">template<typename T> struct Point { // Check if T is int and call MyFunction for int void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0) { std::cout << "T is int." << std::endl; } // Check if T is not int and call MyFunction for non-int void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
但是,此代码可能会导致编译器错误,指示“'struct std::enable_if' 中没有名为 'type' 的类型”。
了解enable_if
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>
以上是如何使用enable_if根据模板参数选择成员函数?的详细内容。更多信息请关注PHP中文网其他相关文章!