Переключенный возврат - PullRequest
       11

Переключенный возврат

2 голосов
/ 30 декабря 2010

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

#include <utility>
#include <type_traits>
using namespace std;
using namespace std::tr1;

template< bool condition, typename Then, typename Else >
struct IF {
    typedef typename Then RET;
};
template<typename Then, typename Else >
struct IF< false, Then, Else > {
    typedef typename Else RET;
};

template<class T>
struct ReturnType {

    typedef typename IF<std::is_pointer<T>::value, T, T& >::RET RET;

};

template<bool condition, typename U>
struct Member {
    Member(){ value = 2; member = &value; };
    int value;
    int* member;
};
template<typename U>
struct Member<false, U> {
    Member(){ member = 5; };
    int member;
};

typedef class tagFOO {
public:

    template < typename T >
    typename ReturnType<T>::RET function()
    {
        Member<std::is_pointer<T>::value, T> ret;

        return ret.member;
    };

} FOO;


int main() {

    int i = 0;
    int* pi = NULL;

    FOO A;

    i = A.function<int>();
    pi = A.function<int*>();

    return 0;
}

Этот код при запуске выводит 5 и 2 соответственно.

Я думаю, что моя первая проблема с этим была связана с определением типа возвращаемого значения, где я хотел бы сделать это

auto function()->decltype(typename ReturnType<T>::RET)

вместо этого. Я не уверен, почему это не работает, я просто получаю неразрешенную ошибку шаблона в любой комбинации всего, что я мог себе представить.

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

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

ТНХ, BekaD:

1 Ответ

1 голос
/ 31 декабря 2010

Может быть, может помочь boost :: call_traits.

http://boost.org/doc/libs/1_45_0/libs/utility/call_traits.htm

...