我有一個有效的示例:我創建一個物件,該物件為列舉的每個值實作“PartInterface”,并將它們添加到映射中。但我覺得這并不令人滿意,因為一切都可以在編譯時而不是在運行時推斷出來。在 C 11 中是否有更優雅的方法來做到這一點?另一種解決方案是在每次呼叫“get”函式時構建“YearPart”、“MonthPart”和“DayPart”物件,但在我看來效率較低......
#include <iostream>
#include <map>
#include <memory>
struct Date{
int year;
int month;
int day;
};
class PartInterface{
public:
virtual const std::string & getName()const=0;
virtual int getValue(const Date& d)const=0;
virtual ~PartInterface(){}
};
class Part : public PartInterface{
public:
Part(const std::string& name):_name(name){}
const std::string & getName()const{
return _name;
}
virtual int getValue(const Date& d)const=0;
private:
std::string _name;
};
class YearPart : public Part{
public:
YearPart():Part("year"){}
int getValue(const Date& d)const{
return d.year;
}
};
class MonthPart : public Part{
public:
MonthPart():Part("month"){}
int getValue(const Date& d)const{
return d.month;
}
};
class DayPart : public Part{
public:
DayPart():Part("day"){}
int getValue(const Date& d)const{
return d.day;
}
};
enum DatePart{
Year,
Month,
Day
};
class Parts{
public:
Parts(){
_map[Year].reset(new YearPart());
_map[Month].reset(new MonthPart());
_map[Day].reset(new DayPart());
};
const PartInterface& get(const DatePart& date_part)const{
return * (_map.find(date_part)->second);
}
private:
std::map<DatePart, std::unique_ptr<PartInterface> > _map;
};
int main() {
Date d({2016, 7, 23});
const Parts parts;
std::cout << "Date "
<< parts.get(Year).getValue(d) << " "
<< parts.get(Month).getValue(d) << " "
<< parts.get(Day).getValue(d) << std::endl;
return 0;
}
uj5u.com熱心網友回復:
老實說,我不明白為什么你需要這整個機器,而一個簡單的int getPart(DatePart,Date)就足夠了。代碼中的大部分低效率似乎都是自制的。無論如何,要在編譯時僅解決從列舉到其他內容的映射,您可以使用模板并將其專門用于列舉值(我省略了所有其他內容,因為我不明白,但您可以將其添加回來,解決方案同樣適用):
#include <iostream>
struct Date{
int year;
int month;
int day;
};
enum DatePart{
Year,
Month,
Day
};
template <DatePart DP>
int getPart(const Date&);
template <> int getPart<Year>(const Date& d){ return d.year;}
template <> int getPart<Month>(const Date& d){ return d.month;}
template <> int getPart<Day>(const Date& d){ return d.day;}
int main() {
Date d({2016, 7, 23});
std::cout << "Date "
<< getPart<Year>(d) << " "
<< getPart<Month>(d) << " "
<< getPart<Day>(d) << std::endl;
}
現場演示
如上所述,如果您確實需要這些Part東西,那么該解決方案也適用。不是專門化模板來根據列舉值回傳不同的成員,您可以專門化它來回傳某些基類的不同派生實體(它甚至可以是不同的回傳型別,當您想要選擇“時不需要運行時多型性”部分”無論如何在編譯時)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389652.html
