Bu biraz fazla uzatma, ama başka birine yardım etme ihtimaline karşı bunu burada bırakacağımı düşündüm. Beni buraya yönlendiren şablon uzmanlığı hakkında googling yapıyordum ve @ maxim1000'in cevabı doğru ve nihayetinde sorunlarımı çözmeme yardımcı olsa da, bunun çok net olduğunu düşünmedim.
Durumum OP'lerden biraz farklı (ama sanırım bu yanıtı bırakacak kadar benzer). Temel olarak, "durum türlerini" tanımlayan tüm farklı sınıf türlerine sahip bir üçüncü taraf kitaplığı kullanıyorum. Bu türlerin kalbi basitçe enum
s'dir, ancak sınıfların tümü ortak (soyut) bir ebeveynden miras alır ve operatör aşırı yükleme ve bir static toString(enum type)
işlev gibi farklı yardımcı işlevler sağlar. Her durum enum
birbirinden farklıdır ve ilgisizdir. Örneğin, birinde enum
alanlar var NORMAL, DEGRADED, INOPERABLE
, diğerinde var AVAILBLE, PENDING, MISSING
, vb. Yazılımım, farklı bileşenler için farklı tür durumları yönetmekten sorumludur. Bunun için toString
işlevleri kullanmak istediğim ortaya çıktı.enum
sınıflar, ancak soyut oldukları için onları doğrudan örnekleyemedim. Kullanmak istediğim her sınıfı genişletebilirdim, ama nihayetinde önemsediğim somut statünün olacağı bir template
sınıf oluşturmaya karar verdim . Muhtemelen bu karar hakkında bazı tartışmalar olabilir, ancak bunun her soyut sınıfı kendi özel sınıfımla genişletmekten ve soyut işlevleri uygulamaktan çok daha az iş olduğunu hissettim . Ve tabii ki kodumda, sadece arayabilmek ve bunun dize temsilini yazdırmasını istedim . Hepsi birbiriyle alakasız olduğundan, her birinin kendine aittypename
enum
enum
.toString(enum type)
enum
enum
toString
(öğrendiğim bazı araştırmalardan sonra) şablon uzmanlığı kullanılarak çağrılması gereken işlevler. Bu beni buraya getirdi. Aşağıda, bunun doğru bir şekilde çalışmasını sağlamak için ne yapmam gerektiğinin bir MCVE'si var. Ve aslında benim çözümüm @ maxim1000'den biraz farklıydı.
Bu, e-postalar için (büyük ölçüde basitleştirilmiş) bir başlık dosyasıdır enum
. Gerçekte, her enum
sınıf kendi dosyasında tanımlanmıştır. Bu dosya, kullandığım kitaplığın bir parçası olarak bana sağlanan başlık dosyalarını temsil ediyor:
#include <string>
class Enum1
{
public:
enum EnumerationItem
{
BEARS1,
BEARS2,
BEARS3
};
static std::string toString(EnumerationItem e)
{
}
};
class Enum2
{
public:
enum EnumerationItem
{
TIGERS1,
TIGERS2,
TIGERS3
};
static std::string toString(EnumerationItem e)
{
}
};
bu satırı sadece sonraki dosyayı farklı bir kod bloğuna ayırmak için eklemek:
#include <string>
template <typename T>
class TemplateExample
{
public:
TemplateExample(T t);
virtual ~TemplateExample();
std::string toString();
private:
T type_;
};
template <typename T>
TemplateExample<T>::TemplateExample(T t)
: type_(t)
{
}
template <typename T>
TemplateExample<T>::~TemplateExample()
{
}
sonraki dosya
#include <string>
#include "enums.h"
#include "TemplateExample.h"
template <>
std::string TemplateExample<Enum1::EnumerationItem>::toString()
{
return Enum1::toString(type_);
}
template <>
std::string TemplateExample<Enum2::EnumerationItem>::toString()
{
return Enum2::toString(type_);
}
sonraki dosya
#include <iostream>
#include "TemplateExample.h"
#include "enums.h"
int main()
{
TemplateExample<Enum1::EnumerationItem> t1(Enum1::EnumerationItem::BEARS1);
TemplateExample<Enum2::EnumerationItem> t2(Enum2::EnumerationItem::TIGERS3);
std::cout << t1.toString() << std::endl;
std::cout << t2.toString() << std::endl;
return 0;
}
ve bu çıktı:
BEARS1
TIGERS3
Bunun sorunumu çözmek için ideal çözüm olup olmadığına dair hiçbir fikrim yok, ama benim için çalıştı. Şimdi, kaç numaralandırma türü kullandığım önemli değil, tek yapmam gereken toString
.cpp dosyasındaki yöntem için birkaç satır eklemek ve zaten tanımlanmış olan kitaplıkları toString
, kendim uygulamadan ve her birini genişletmeden kullanabilirim. enum
sınıf kullanmak istiyorum.