Вот (искусственный) пример использования функции, которая возвращает анонимную структуру и делает что-то полезное:
#include <iostream>
template<typename T>
T* func(T* t, float a, float b) {
if(!t) {
t = new T;
t->a = a;
t->b = b;
} else {
t->a += a;
t->b += b;
}
return t;
}
struct {
float a, b;
}* foo(float a, float b) {
if(a==0) return 0;
return func(foo(a-1,b), a, b);
}
int main() {
std::cout << foo(5,6)->a << std::endl;
std::cout << foo(5,6)->b << std::endl;
void* v = (void*)(foo(5,6));
//[1] delete f now because I know struct is floats only.
float* f = (float*)(v);
std::cout << f[0] << std::endl;
std::cout << f[1] << std::endl;
delete[] f;
return 0;
}
Есть несколько моментов, которые я хотел бы обсудить:
- Как очевидно, этот код просачивается, так или иначе я не могу просачиваться, не зная, что такое определение базовой структуры? см. комментарий [1].
- Мне нужно вернуть указатель на анонимную структуру, чтобы я мог создать экземпляр объекта в templatized function
func
, могу ли я сделать что-то подобное, не возвращая указатель? - Я думаю, что самое главное, для этого вообще ЛЮБОЙ (реальный)? В качестве примера приведенного выше утечки и, по общему признанию, изобретательны.
Кстати, что делает функция foo(a,b)
, возвращать структуру, содержащую два числа, сумму всех чисел от 1 до a и произведение a и b.
Возможно, строка new T
может использовать boost:: shared_ptr, чтобы избежать утечек, но я этого не пробовал. Будет ли это работать?
Я думаю, что просто пытался удалить анонимную структуру как массив float, что-то вроде float * f = new float [2]. Что может быть неправильным, как предлагает следующий комментарий, так что можно сделать? я могу удалить вообще?
Я могу скомпилировать и запустить этот код "как есть" на VS2008, возможно, некоторые нестандартные расширения могут использоваться VS, но он работает и дает 15 и 30 в качестве ответа.
Из ответов я считаю, что это приспособление является специфическим объектом VS2008, оно не соответствует стандартам и, следовательно, не переносимо. Слишком плохо, хотя, мне бы хотелось увидеть, что Voodoo Stackoverflow или Boost люди придумали, если это было в их арсенале:). Спасибо всем.