Предположим, что следующие две версии одного и того же класса А:Что лучше: явный или безличный get()?
Version 1
class A
{
public:
enum class Retrievable { Integer, String };
A(): m_integer(123), m_string("string") {}
~A() {}
void* get(const Retrievable r)
{
switch (r)
{
case Retrievable::Integer:
return static_cast<void*>(&m_integer);
case Retrievable::String:
return static_cast<void*>(&m_string);
default:
throw;
}
}
private:
int m_integer;
std::string m_string;
};
версия 2
class A
{
public:
A(): m_integer(123), m_string("string") {}
~A() {}
int getInteger() { return m_integer; }
std::string getString() { return m_string; }
private:
int m_integer;
std::string m_string;
};
С точки зрения ясности, эффективности и расширяемости, какой из этих двух парадигм - единственная функция без функции get() или отдельная функция get() - лучше?
Последний. В первом вам нужно указать как параметр 'r', так и тип возврата, который является подверженным ошибкам и излишним. Это также невозможно сделать «виртуальным». Первый полезен, когда вы каким-то образом используете указанный тип, например. для 'dynamic_cast', но в этом примере вы этого не делаете. – StenSoft
Код, который не компилируется, быстрее, чем код, который делает. Версия 1 не компилируется, так что явная производительность. Чего ждать? Если вы хотите узнать, лучше ли вариант 1 или вариант 2, укажите * действующий рабочий код *, который описывает ваши варианты. Поскольку вышеизложенное не имеет никакого смысла - мне пришлось бы принципиально переписать один из ваших вариантов, чтобы он скомпилировался, и кто знает, переписал бы он тот же код таким же образом. – Yakk
@Yakk Честно говоря, я еще не понял, в какой кодировке я могу скомпилировать рабочий образец. Однако я использовал второй метод по другим причинам. Это было теоретическое упражнение, мне было любопытно узнать ответ. Я уверен, что я могу собрать что-то подобное. Речь шла о теории, стоящей за ней, а не конкретно о том, что я опубликовал (я полагал, что это было по крайней мере частично неправильным). – Frostfyre