Aşağıdaki örneği göz önünde bulundurun:Belirli bir tür özelliği olan tüm tipler için nasıl bir işlev şablonu yazabilirim?
struct Scanner
{
template <typename T>
T get();
};
template <>
string Scanner::get()
{
return string("string");
}
template <>
int Scanner::get()
{
return 10;
}
int main()
{
Scanner scanner;
string s = scanner.get<string>();
int i = scanner.get<int>();
}
Scanner
sınıfı, bazı kaynaklardan tokenleri ayıklamak için kullanılır. Yukarıdaki kod iyi çalışıyor, ancak get
veya unsigned int
gibi get
diğer tümleşik türleri denediğimde başarısız oluyor. Bu türleri okuyabilecek kod, int
değerini okuyacak kodla tamamen aynıdır. Okumak istediğim diğer tüm integral türleri için kodu çoğaltabilirim, ancak tüm integral tipler için bir fonksiyon şablonunu tanımlamayı tercih ederim.
Aşağıdakileri denedim:
struct Scanner
{
template <typename T>
typename enable_if<boost::is_integral<T>, T>::type get();
};
Bir çekicilik gibi çalışır, ancak Scanner::get<string>()
işlevini yeniden nasıl çalıştıracağından emin değilim. Bu yüzden, scanner.get<string>()
ve scanner.get<any integral type>()
yapabilmem ve tüm ayrılmaz türlerini okumak için tek bir tanıma sahip olabilmem için kodu nasıl yazabilirim?
Güncelleme: bonus soru: Birden fazla sınıf aralığını bazı özelliklere göre kabul etmek istiyorsam ne yapmalıyım? Örneğin: (i) tümleşik türleri (ii) sırasıyla kayan nokta türleri (iii) dizeleri kabul eden üç get
işlevine sahip olmak istiyorsanız, bu soruna nasıl yaklaşmalıyım.
“disable_if” dosyasındaki argümanları birleştirmek için muhtemelen “boost :: mpl :: and_” ve “boost :: mpl :: or_” komutlarını kullanabileceğinizi belirtmek isterim. +1 yine de :) –
Ayrıca Boost kütüphanesinden 'ice_and' ve' ice_or' kullanabilirsiniz. –