Эмуляция возврата в макросе - PullRequest
1 голос
/ 18 августа 2010

Существует ли какой-либо стандартный совместимый способ эмуляции возврата с помощью макроса?

В настоящее время я пытаюсь обернуть функцию _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 'Буду также признателен, если кто-то предложит способ улучшить макрос.

1 Ответ

0 голосов
/ 18 августа 2010

вы можете использовать , оператор:

v = (expr1, expr2); // evaluate both expressions, return rightmost
...