2012-12-24 165 views
4

如果我想寫的是有一個可選的類型參數,我可以做以下的類:C++ 11可選模板類型參數?

template<typename T> 
struct X 
{ 
     T t; 
}; 

template<> 
struct X<void> 
{ 

}; 

int main() 
{ 
     X<int> a; 
     X<void> b; 
}; 

有沒有把它寫,這樣的空隙是不必要的一種方式?即:

int main() 
{ 
     X<int> a; 
     X b; 
}; 

我嘗試這樣做:

template<typename T = void> 
struct X 
{ 
    T t; 
}; 

template<> 
struct X<void> 
{ 

}; 

int main() 
{ 
    X<int> a; 
    X b; 
}; 

,但我得到:

test.cpp: In function ‘int main()’: 
test.cpp:16:4: error: missing template arguments before ‘b’ 
test.cpp:16:4: error: expected ‘;’ before ‘b’ 
+1

你可以做的最好的是'X <> b'。 –

+0

我知道不使用模板的唯一解決方案是製作非模板化的子類。 –

+0

你在第二次嘗試時做了一切正確的事情,除了當用默認參數實例化你的模板時,你仍然需要指定空'<>',即它必須是'X <> b;' – AnT

回答

4

技術上你需要寫:

X<> b; 

但你完全可以解決這個問題醜用typedef:

typedef X<> Y; 

然後你就可以這樣做:

Y b; 
+1

在這種情況下,你可以以及'typedef X Y;'並避免默認值。 – addaon

1

如果只有這是可能的:

template <typename T> 
using X = std::is_void<T>::value ? _X<> : _X<T> 

但是,這並不編譯所以很遺憾,你被套牢了typedef像其他回答。

+0

有'typename std :: conditional :: value,_X <>:_X > :: type'。我知道這很舊,但值得分享。 – Rapptz