我試圖了解 SFINAE 在 C 98 中是如何作業的。
我的目標是撰寫一個簡單的模板函式,該函式僅在傳遞整數時呼叫。但計劃是在不專門為型別名 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 :
我從這個問題的第一個答案中獲取了 enable_if 語法,它需要在 C 98 中實作enable_if和is_integral執行(<type_traits> 不是 C 98 標頭)。
我的問題是這個程式輸出:
SECOND 123
true
我的問題是,為什么會發生這種情況?我希望呼叫 print 的第一個實作。我的方法是不可能的(即這只能通過將通用列印函式專門用于 int 來完成),還是我做錯了什么?
uj5u.com熱心網友回復:
我的目標是撰寫一個簡單的模板函式,它只會在傳遞整數時呼叫。
無需提供 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://www.uj5u.com/qukuanlian/519913.html
標籤:C 模板脊骨C 98
下一篇:wso2為用戶操作啟用通知
