По сути, мне здесь нравится делать шаблонный вызов функции, когда вызывающая сторона по существу запрашивает заданный тип и указатель или ссылка будут переданы обратно. Основываясь на типе, указанном в шаблоне, я хочу вернуть извлеченный нескорректированный указатель, если это указатель и если это сохраненное значение, я бы хотел переключить тип на ссылку. Я также хотел бы расширить эту мысль, чтобы включить ссылки, классы, указатели на классы и так далее ...
#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: