我正在努力了解SFINAE在C++98中是如何工作的。
我的目标是编写一个简单的模板函数,该函数只有在则传递一个整数。但我们的计划是在不专门化typename T=int的函数的情况下进行,而是用一个伪参数定义一个模板函数,以检查pased元素是否为整数。这是我的玩具代码:
// 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
我从这个问题的第一个答案中获得了enable_if语法,它需要在C++98中实现enable_if
和is_integral
(<type_traits>不是C++98标头(
我的问题是这个程序输出:
SECOND 123
true
我的问题是,为什么会发生这种情况?我原以为会调用print的第一个实现。我的方法是不可能的(即,这只能通过将通用打印函数专门化为int来完成(,还是我做错了什么?
我的目标是编写一个简单的模板函数,该函数只有在传递整数时才会被调用。
无需提供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
}