2014-10-28 4 views
-2

У меня есть функция, которая должна возвращать объект класса A, если i положительна, возвращает целое число else. Это сильный упрощенный пример, и я не могу использовать перегрузку!C++: два типа возврата | templates

#include <iostream> 

template <typename T> 
T& function(int i){ 
    T res; 
    if (i>0){ 
     A res = 1; 
    } 
    else{ 
     int res = 5; 
    } 
    return res; 
} 


int main(){ 
    A res1 = function(5); 
    int res2 = function(-5;) 
    return 0; 
} 
+0

Используйте тип 'union'. – Barmar

+0

Почему вы думаете, что хотите этого? – OmnipotentEntity

+0

Являются ли параметры аргументов постоянной времени компиляции? –

ответ

2

Типы статические, определенные при компиляции кода, поэтому у вас не может быть другого типа возврата в зависимости от значения времени выполнения. Функция может возвращать только один тип.

Один из вариантов - использовать дискриминационный союз; объединение различных типов, которые вы хотите поддержать, вместе с перечисляемым значением, чтобы указать, какой тип активен. Это довольно сложно реализовать, если вы хотите поддерживать общие типы классов, поэтому вам может понадобиться посмотреть библиотеку Boost Variant. Например:

boost::variant<int,T> function(int i) { 
    if (i>0) 
     return A{1}; 
    else 
     return int{5}; 
} 

int main() { 
    A res1 = boost::get<A>(function(5)); 
    int res2 = boost::get<int>(funtion(-5); 
} 

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

template <typename Callback> 
void function(int i, Callback & callback) 
    if (i>0) 
     callback(A{1}); 
    else 
     callback(int{5}); 
} 

struct MyCallback { 
    void operator()(A const &) {/* do something with A */} 
    void operator()(int)  {/* do something with int */} 
}; 

int main() { 
    MyCallback callback; 
    function(5, callback); // calls callback for A 
    function(-5, callback); // calls callback for int 
} 
0

То, что вы пытаетесь сделать, невозможно. У вашей функции может быть только один тип возврата. Вы можете передать переменную A и целочисленную переменную по ссылке и установить одну или другую функцию, но это самое близкое, что вы сможете получить. Я, скорее, не уверен, что вы пытаетесь выполнить.

+0

На самом деле невозможно. Просто сложно и требует дополнительной работы. Я тоже хотел бы знать, что он на самом деле пытается сделать. Потому что это плохое решение для легкой проблемы. – OmnipotentEntity

+0

@OmnipotentEntity просто размышляет сейчас, но может быть, что OP используется для «динамически типизированных» языков, например. LUA, где подобные вещи тривиальны. – dgnuff

+0

@OmnipotentEntity. Я не вижу, как было бы возможно, кроме возвращения объекта-оболочки или чего-то подобного, я не знаю, действительно ли я считаю, что тип возвращаемого значения переменной. Разве есть другой способ? – Matt

0

C++ просто не поддерживает это.

Лучшим решением было бы:

bool function(int i, int &intResult, A &AResult) 
{ 
    if (i > 0) 
    { 
     AResult = A(1); 
     // Or whatever other code you need to place the result in AResult 
     return true; 
    } 
    intResult = 5; 
    return false; 
} 

Вам необходимо пройти одновременно ИНТ и А получить возможные возвращаемые значения, и, проверив логическое значение, что вернулся вы знаете, какой из них был заполнен

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