2012-12-04 19 views
6

Şablonum olmasını istediğim bir işlev var, şu anda std::string ve std::wstring için iki farklı sürümüm var.Şablonlar ve sabit dizeler

fonksiyonu (şeritli), bu

template <class T, class _Tc> 
std::vector<T> TokenizeArgs(const T& in) { 
const T tofind = T("\"' "); 
.. do stuff .. 
} 

T gibidir ya std::string veya std::wstring ve _Tcchar veya wchar_t ya olmasıdır. Şablon sürümünde çalışmayı tanımladığım sabit dizeleri almayla ilgili bir sorun yaşıyorum. Yukarıdaki kod std::string için çalışıyor, ancak std::wstring için değil, çünkü std::wstring için char* dizisini alan bir kurucu yok. Normalde bunu düzeltmek için sabit dizeyi const T tofind = L"\"' " olarak bildiririm, ancak std::string ile çalışmaz.

Şablonlarla çok fazla deneyimim yok ve bu sorunu nasıl düzelteceğimi gerçekten bilmiyorum.

+0

@ BЈовић Öyle düşünürdüm çünkü işlevler birbirinin aynıdır – user1520427

cevap

6

Kasa oluşturma işlemini kendi fabrika işlevine taşıyabilir ve işlevi string ve wstring için ayrı ayrı özelleştirebilirsiniz.

const T tofind = CreateConst<T>(); 


template <class T> 
const T CreateConst(); 

template <> 
const std::string CreateConst<std::string>() 
{ 
    return std::string("\"' "); 
} 

template <> 
const std::wstring CreateConst<std::wstring>() 
{ 
    return std::wstring(L"\"' "); 
}