首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++98中的SFINAE

C++98中的SFINAE
EN

Stack Overflow用户
提问于 2022-10-20 10:37:50
回答 1查看 55关注 0票数 0

我正在试图了解如何在C++98的SFINAE工作。

我的目标是编写一个只在传递整数时才调用的简单模板函数。但是,我们的计划是在不为typename T= int专门化函数的情况下这样做,但是用一个虚拟参数定义一个模板函数,该参数检查被除数元素是否是一个整数。这是我的玩具代码:

代码语言:javascript
复制
// header.h

#include <iostream>
#include <cstddef>

struct false_type {
    static const bool value = false;
};

struct true_type {
    static const bool value = true;
};

template < bool, typename T >
struct enable_if
{};

template <typename T>
struct enable_if<true, T>
{ typedef T type; };

template <typename T>
struct is_integral : false_type {};

template <>
struct is_integral<int> : true_type {};

/* ... more is_integral specializations ... */

template < typename T > 
void print(T& value, typename enable_if<!is_integral<T>::value,T>::type* = 0)
{
    std::cout << "FIRST " << value << std::endl;
}

template < typename T > 
void print(T& value)
{
    std::cout << "SECOND " << value << std::endl;
    std::cout << std::boolalpha;
    std::cout << is_integral<T>::value << std::endl;
}

// main.cpp

#include "header.hpp"

int main() {
    int a = 123;
    print<int>(a);
}

它编译如下:g++ -Wall -Wextra -Werror -std=c++98 -pedantic -g3 -Wno-c++0x-compat main.cpp

我从this question's first answer获得了this question's first answer语法,它需要在C++98中执行enable_ifis_integral的实现(>不是C++98头)。

我的问题是这个程序输出:

代码语言:javascript
复制
SECOND 123
true

我的问题是,为什么会发生这种事?我希望第一次打印的实现会被调用。我的方法是不可能的(也就是说,这只能通过专门化一个泛型打印函数来完成),还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-20 11:14:16

--我的目标是编写一个只在传递一个整数时才调用的简单模板函数()。

没有必要提供2个过载。您只需删除!并拥有第一个主模板,如下所示:

代码语言:javascript
复制
template < typename T > 
void print(T& value, typename enable_if<is_integral<T>::value,T>::type* = 0)
{
    std::cout << "FIRST " << value << std::endl;
}

int main() {
    int a = 123;
    print<int>(a);  //works 
    //print<double>(4.4);                      //doesn't work
    //print<std::string>(std::string("f"));   //doesn't work
    //print(3.3);                             //doesn't work
    double d = 3.3;
    //print(d);                               //doesn't work
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74138476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档