Re: Определить создаваемость объекта на куче
От: rg45 СССР  
Дата: 04.10.22 11:10
Оценка: 15 (2) +1
Здравствуйте, Went, Вы писали:

W>Здравствуйте. Нужен трейт, чтобы определял, можно ли создать создать объект на куче используя стандартный new или placement new:

W>
W>auto x = new X();
W>auto x2 = new (malloc(sizeof(X))) X();
W>


Как я догадываюсь, концепты не предлагать? Тогда старый добрый SFINAE:

http://coliru.stacked-crooked.com/a/c86ada698918bdfc

#include <iostream>
#include <type_traits>

template <typename T, typename = T*>
struct is_new_available : std::false_type {};

template <typename T>
struct is_new_available<T, decltype(new T())> : std::true_type {};

struct A
{
    static void* operator new(size_t) = delete;
};

int main()
{
    std::cout << is_new_available<int>::value << std::endl; // -> 1
    std::cout << is_new_available<A>::value << std::endl; // -> 0
}


Таким же образом проверяется и placement new.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.