[英]How to use enable_if and template specialization c++?
我試圖在boost中使用enable_if進行模板特化,但是無法使它工作並且如何編寫它以及語法實際意味着什么。 我已經閱讀了增強文檔,但對我來說仍然沒有意義
我有四種方法,我希望所有人都被命名為相同的東西,都非常相似。 我有兩個函數將返回一個字符串和兩個將返回一個整數的函數。 在每種情況下,參數都是int,int,return type或int,const char *,返回類型,因為最后一個參數將是可以返回的默認值。
所以像這樣......
int getVal(int,int,int)
int getVal(int,const char*,int)
string getVal(int,int,string)
string getVal(int,const char*,string)
但這不起作用,因為參數是相同的,只有返回類型不同,我需要它是一個模板化的方法,而不僅僅是一個重載的方法。 這是一個非模板類。 所以我需要enable_if如果返回類型是字符串或int,或者可能在最后一個參數上檢查enable_if?
任何幫助將不勝感激,如果有人能夠解釋語法的含義,並且實際上這樣做也會有所幫助。 謝謝
這是我嘗試獲取正確語法的眾多嘗試之一..
template<typename myType>
typename enable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
template<typename myType>
typename disable_if<boost::is_arithmetic<myType>, myType>::type
GetValue(int row, int col, myType d)
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, String);
}
catch(DatatableException e){
return d;
}
return this->m_rows[row][col];
}
template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<!T> >::type* dummy = 0){
{
unsigned int columnIndex = this->GetColumnIndex(col);
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
template <class T>
T GetValue(int row, typename enable_if<is_arithmetic<T> >::type* dummy = 0){
try {
CheckColumnType(col, Integer);
}
catch(DatatableException e){
return d;
}
if("0" == this->m_rows[row][col])
{
return 0;
}
else if("1" == this->m_rows[row][col])
{
return 1;
}
else
{
return atoi(this->m_rows[row][col].c_str());
}
}
我不確定std::enable_if
是否是你要找的。 您是否嘗試使用功能模板專業化?
template <typename T>
T function(int number, T const& result = T());
template <>
std::string function(int number, std::string const& result)
{
// implementation for T = std::string
return result;
}
template <>
int function(int number, int const& result)
{
// implementation for T = int
return result;
}
請注意,這需要C ++ 11。 默認參數的歧義可以通過顯式指定類型來解決,例如int ret = function<int>(1);
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.