我已經在這裏實現了這個函數(在一個頭文件中)。C++模板函數實現不正確
//header.h
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <stdint.h>
#include <type_traits>
template < typename T,
typename = std::enable_if<std::is_integral<T> >::type >
void f(T t) {
printf("Integer function\n");
}
template void f(int i);
主要是以下...
#include "header.h"
int main(int argc, char** argv) {
int p = 3;
f(p);
}
它編譯...沒問題,但它不顯示的printf的內容,我失去了什麼?... (我使用Eclipse作爲IDE,這可能是一個問題?)
還有一件事......這是否有意義這種實現? (我想根據輸入中的類型編寫不同的代碼,不管它是否未簽名)。
template < typename T,
typename = std::enable_if<std::is_integral<T>::value>,
typename = std::enable_if<std::is_unsigned<T>::value>
>
void f(T t) {
printf("Unsigned f version.\n");
}
template < typename T,
typename = std::enable_if<std::is_integral<T>::value>,
typename = std::enable_if<std::is_signed<T>::value>
>
void f(T t) {
printf("Signed f version.\n");
}
在這種情況下,它不編譯...所以如何處理這個?
謝謝
更新...
我試圖修改第一個代碼提示,它給了我下面的錯誤
..\header.h:19:58: error: type/value mismatch at argument 1 in template parameter list for 'template<bool <anonymous>, class _Tp> struct std::enable_if'
typename = std::enable_if<std::is_integral<T> >::type >
^
..\header.h:19:58: error: expected a constant of type 'bool', got 'std::is_integral<_Tp>'
..\header.h:19:61: error: expected '>' before 'type'
typename = std::enable_if<std::is_integral<T> >::type >
^
..\main.cc: In function 'int main(int, char**)':
更新2 ...
好吧,我一直在試圖弄清楚它是什麼,我不明白...所以我正在深入type_traits的代碼(所以我的目標是要了解我做錯了什麼......)
我報告enable_if的代碼(來自type_traits)。
template<bool, typename _Tp = void>
struct enable_if //Lukkio decl. 1
{ };
// Partial specialization for true.
template<typename _Tp>
struct enable_if<true, _Tp> //Lukkio decl. 2
{ typedef _Tp type; };
,因爲我想了解發生了什麼樣的行:
template<
typename T,
typename = std::enable_if<std::is_integral<T>::value>
>
void function(T t) {
printf("Is integral!\n");
}
因此,假設T
是固定的(比方說,int,它是Integrale的)的std::enable_if::value>
使用DECL。 1,但是假設_Tp
是void
型所以實際上發生了什麼,在還原條件(我現在替代到T
關鍵字int
......應該是這樣的
template<
typename int,
typename = std::enable_if<std::is_integral<int>::value>
>
即
template<
typename int,
typename = std::enable_if<1>
>
所以我的問題是......第二個類型名稱代表什麼?
'std :: enable_if_t'或'std :: enable_if <..> :: type' – Columbo
感謝您的回答@Columbo,有什麼區別? – user8469759
爲什麼在'header.h'中聲明'template void f(int i);'? – CinCout