Существует ли какой-либо стандартный совместимый способ эмуляции возврата с помощью макроса?
В настоящее время я пытаюсь обернуть функцию _alloca для эмуляции массива переменной длины в стеке (который поддерживается в C99) с помощью макроса вC ++.Поскольку функция _alloca манипулирует указателем стека, я думаю, что встроенная функция не подходит для этого времени.
Ниже приведен текущий код, который я написал.
template <typename T>
inline void __placement_new_array(T arr[], const size_t size) {
assert(size > 0);
for (size_t i = 0; i < size; i++) {
new (&arr[i]) T;
}
}
template <typename T>
class __arraydtor
{
public:
__arraydtor(T arr[], size_t size) : arr_(arr), size_(size) {}
~__arraydtor() {
for (size_t i = size_ - 1; i != (size_t)(-1); i--) {
arr_[i].~T();
}
}
private:
T* arr_;
size_t size_;
};
#define stack_alloc(size) _alloca(size)
#define stacknew(ptr, type, size) \
ptr = static_cast<type*>(stack_alloc(sizeof(type) * size));\
__placement_new_array(ptr, size);\
__arraydtor<type> __##type##_dtor_instance(ptr,size)
...
type* pos;
stacknew(pos, type, size);
Я думаю, чтокод довольно удобен даже сейчас (он работает для большинства типов, по крайней мере, в vs2005), но в конечном итоге я хочу получить макрос, который можно использовать, как показано ниже -
pos = stacknew(type, size);
(конечно, pos = stacknew type[размер]; было бы более круто, но я не думаю, что есть способ добиться этого с помощью любого компилятора C ++)
Поскольку макрос содержит некоторое объявление, эмуляция возврата в текущей форме невозможна -это может быть невозможно или требует другого подхода.Но у меня нет опыта использования макросов, я не могу судить, возможно это или нет.
Также хочу отметить, что приведенный выше код небезопасен, когда ctor целевого массива выдает исключение - I 'Буду также признателен, если кто-то предложит способ улучшить макрос.