2013-05-29 2 views
3

Ok, так что я борюсь со следующим:Возвращайтесь различные типы из C++ функций

У меня есть класс (A), который держит vector<B> (вектор для Qt) некоторых других классов (B). Класс B имеет свойство, скажем p, а также имеет имя.

В одном случае, я хотел бы получить распечатку B объектов, которые можно найти в классе A, которые имеют множество p собственности, и для другого случая я хотел бы получить список фамилий B объекты, которые имеют свойство.

И больше всего, я хотел бы, чтобы эти две функции можно назвать то же самое :)

Так, что-то вроде:

class A 
{ 
public: 
    QVector<B*> B_s_with_p() { ... } 

    QStringList B_s_with_p() { ... } 
}; 

, но я не хочу иметь помощника параметр, чтобы перегрузить методы (да, это было бы легко), а ближайший я получил метод с другим именем ... которое работает, но оно уродливо. Шаблоны, похоже, тоже не работают.

Есть ли способ использовать todays 'C++ для его достижения?

+0

Вместо того, чтобы возвращаться по значению, почему бы не передать аргумент по ссылке для заполнения? – hmjd

+0

Зачем вам две функции, которые делают разные вещи с тем же именем? –

+0

Возможный дубликат [Почему функции не могут быть перегружены с помощью типа возврата?] (Http://stackoverflow.com/questions/4331837/why-cant-functions-be-overloaded-by-return-type) с некоторыми обходными способами [ здесь] (http://stackoverflow.com/questions/226144/overload-ac-function-according-to-the-return-value), хотя я бы не рекомендовал его. –

ответ

4

Чит должен использовать ссылку на QVector<B*> или QStringList как аргумент вместо возвращаемого типа. Таким образом, вы можете перегрузить B_s_with_p как обычно. Думаю, вы не считаете, что это действительный вариант.

+0

Это не обман, а обычный способ справиться с такой ситуацией (если вы действительно ДОЛЖНЫ иметь такое же имя функции, то есть) – arne

+0

Я назвал это читом, потому что Я предполагаю, что это не то, чего хочет OP. –

3

Только подпись используется для перегрузки методов. Это означает, что тип возврата не может использоваться для перегрузки.

Вы должны использовать имена разных методов или управлять возвращаемым значением с параметром:

class A 
{ 
public: 
    void B_s_with_p(QVector<B*>&); 
    void B_s_with_p(QStringList&); 
}; 

B_s_with_p() может использовать тип шаблона в качестве параметра.

+1

Да, стандартная практика. Он удовлетворяет требованию «нужно иметь то же имя». И если вы искали способ игнорировать возвращаемое значение, вы должны использовать аргументы указателя вместо ссылок и проверять «nullptr» перед их назначением. Но в этом случае это не похоже, что функции будут когда-либо вызваны только для их побочных эффектов. –

-1

Проверьте дизайн .. Перегруженные функции, которые имеют один подобный funcionality, но различные типы аргументов .. Так что проверить, почему вы хотите

I would like to have these two functions to be called the same 

см: What is the use/advantage of function overloading?

Преимущество перегрузки является последовательностью при именовании функций, выполняющих одну и ту же задачу, только с разными параметрами.

0

Почему вы думаете, что с двумя разными именами для два разных набора функциональности уродливый? Это точно что вы должны делать, чтобы разграничить различные типы возвращаемых здесь.

Другой альтернативой является только функция, которая возвращает объект, а затем создать names_of метод, который вы передаете список B объектов и возвращает список имен.

Смежные вопросы