我正在试图了解如何在C++98的SFINAE工作。
我的目标是编写一个只在传递整数时才调用的简单模板函数。但是,我们的计划是在不为typename T= int专门化函数的情况下这样做,但是用一个虚拟参数定义一个模板函数,该参数检查被除数元素是否是一个整数。这是我的玩具代码:
// 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_if和is_integral的实现(>不是C++98头)。
我的问题是这个程序输出:
SECOND 123
true我的问题是,为什么会发生这种事?我希望第一次打印的实现会被调用。我的方法是不可能的(也就是说,这只能通过专门化一个泛型打印函数来完成),还是我做错了什么?
发布于 2022-10-20 11:14:16
--我的目标是编写一个只在传递一个整数时才调用的简单模板函数()。
没有必要提供2个过载。您只需删除!并拥有第一个主模板,如下所示:
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
}https://stackoverflow.com/questions/74138476
复制相似问题