Ini sedikit OT, tapi saya pikir saya akan meninggalkan ini di sini kalau-kalau ini membantu orang lain. Saya sedang mencari di Google tentang spesialisasi template yang membawa saya ke sini, dan sementara jawaban @ maxim1000 benar dan pada akhirnya membantu saya menemukan masalah saya, saya tidak berpikir itu sangat jelas.
Situasi saya sedikit berbeda (tetapi saya pikir cukup mirip untuk meninggalkan jawaban ini) daripada OP. Pada dasarnya, saya menggunakan pustaka pihak ketiga dengan semua jenis kelas yang berbeda yang mendefinisikan "tipe status". Inti dari jenis ini hanyalah enum
s, tetapi semua kelas mewarisi dari induk umum (abstrak) dan menyediakan fungsi utilitas yang berbeda, seperti kelebihan beban operator dan static toString(enum type)
fungsi. Setiap status enum
berbeda satu sama lain dan tidak terkait. Misalnya, yang satu enum
memiliki kolom NORMAL, DEGRADED, INOPERABLE
, yang lain memiliki AVAILBLE, PENDING, MISSING
, dll. Perangkat lunak saya bertugas mengelola berbagai jenis status untuk berbagai komponen. Ternyata saya ingin memanfaatkan toString
fungsi untuk inienum
kelas, tetapi karena mereka abstrak saya tidak bisa membuat instance secara langsung. Saya dapat memperluas setiap kelas yang ingin saya gunakan, tetapi akhirnya saya memutuskan untuk membuat template
kelas, di mana typename
status konkret apa pun yang enum
saya pedulikan. Mungkin beberapa perdebatan dapat terjadi tentang keputusan itu, tetapi saya merasa itu adalah pekerjaan yang jauh lebih sedikit daripada memperluas setiap enum
kelas abstrak dengan kelas kustom saya sendiri dan menerapkan fungsi abstrak. Dan tentu saja dalam kode saya, saya hanya ingin dapat memanggil .toString(enum type)
dan mencetak representasi string itu enum
. Karena semua enum
itu sama sekali tidak terkait, mereka masing-masing memiliki miliknya sendiritoString
fungsi yang (setelah beberapa penelitian yang saya pelajari) harus dipanggil menggunakan spesialisasi template. Itu membawaku ke sini. Di bawah ini adalah MCVE dari apa yang harus saya lakukan untuk membuat ini bekerja dengan benar. Dan sebenarnya solusi saya sedikit berbeda dari @ maxim1000.
Ini adalah file header (sangat disederhanakan) untuk enum
s. Pada kenyataannya, setiap enum
kelas didefinisikan dalam filenya sendiri. File ini mewakili file header yang diberikan kepada saya sebagai bagian dari pustaka yang saya gunakan:
#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)
{
}
};
menambahkan baris ini hanya untuk memisahkan file berikutnya ke dalam blok kode yang berbeda:
#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()
{
}
file berikutnya
#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_);
}
file berikutnya
#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;
}
dan keluaran ini:
BEARS1
TIGERS3
Tidak tahu apakah ini adalah solusi ideal untuk menyelesaikan masalah saya, tetapi berhasil untuk saya. Sekarang, tidak peduli berapa banyak jenis enumerasi yang akhirnya saya gunakan, yang harus saya lakukan hanyalah menambahkan beberapa baris untuk toString
metode di file .cpp, dan saya dapat menggunakan metode perpustakaan yang sudah ditentukan toString
tanpa menerapkannya sendiri dan tanpa memperluas masing-masing enum
kelas yang ingin saya gunakan.