LINUX.ORG.RU

[C++]Ограничить шаблон встроенными типами.

 


0

0

Сабж. Нужно чтобы шаблонный оператор работал только со встренными типами(int, float, int* и т.д). Если пользовательский тип не был специализирован, то при попытке конкретизации должна быть ошибка компиляции. Это возможно?

★★

>Нужно чтобы шаблонный оператор работал только со встренными типами(int, float, int* и т.д). Если пользовательский тип не был специализирован, то при попытке конкретизации должна быть ошибка компиляции.

Что-то типа Loki::TypeTraits<T>::isAtomic

Absurd ★★★
()
Ответ на: комментарий от Booster

>>Что-то типа Loki::TypeTraits<T>::isAtomic

Что-то я там не найду такого. ver 0.1.7

isFundamental тогда

Absurd ★★★
()

понаделайте полных шаблонных спецификаций для встроенных типов, а в общем виде пускай будет директива для ошибки компиляции

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

>понаделайте полных шаблонных спецификаций для встроенных типов

Именно так Loki и устроен - перебор всех вариантов десятками килобайт. ОбобщенностьЪ.

Absurd ★★★
()
Ответ на: комментарий от yoghurt

То есть делаем шаблон isFundamental который возвращает false, затем специализируем всем встроенными типами с возвратом true? Идея ясна, только ещё ошибку нужно прикрутить, полагаю вызов функции в теле которой абракадабра подойдёт. Но как лучше сделать?

Booster ★★
() автор топика
Ответ на: комментарий от Booster

Мне нужно сгенерить ошибку компиляции и желательно повнятней.

Извращения с шаблонами в C++ и внятные ошибки компиляции - это взаимоисключающие параграфы. Хорошо если сообщение об ошибке влазит в один экран... =)

Deleted
()
Ответ на: комментарий от Deleted

Знаю что в бусте есть почти всё что надо, но в данном проекте он не применим, как и Loki. Приходится велосипедировать.

Booster ★★
() автор топика

Use boost's enable_if with type_traits, Luke!

l5k
()
Ответ на: комментарий от Booster

Ну тогда что-то типа:

template <class T> struct Foo {};
struct Foo<int> { static void isFundamental() {} };
struct Foo<char> { static void isFundamental() {} };
struct Foo<void *> { static void isFundamental() {} };
struct Foo<float> { static void isFundamental() {} };
/* И т.п. для всех "разрешённых типов". */

/* Далее в классе, типы для шаблона которого нужно фильтровать: */
template <class T> class Boo
{
    void someFn()
    {
         Foo<T>::isFundamental(); /* На разрешённом типе ничего не будет делать, на не разрешённом - компилятор выдаст ошибку о том, что такой функции нет. */
    }

    /* ... */
};

Deleted
()
Ответ на: комментарий от Booster

Ну тогда тебя спасёт bcp. Тебе понадобятся только хедеры и никаких либ.

l5k
()
Ответ на: комментарий от Booster

Знаю что в бусте есть почти всё что надо, но в данном проекте он не применим, как и Loki. Приходится велосипедировать.

а просто посмотреть и сделать так же? type traits достаточно просто реализуются, anyway; в любом случае стоит почитать Майерса:

http://www.cantrip.org/traits.html

jtootf ★★★★★
()
Ответ на: комментарий от Deleted

> тогда что-то типа:
Спасибо, то что нужно.

jtootf спасибо почитаю.


Booster ★★
() автор топика
Ответ на: комментарий от Booster

>Знаю что в бусте есть почти всё что надо, но в данном проекте он не применим, как и Loki.

Можно из локи выдрать TypeTraits.hpp. Эта часть библиотеки AFAIK вообще никакого кода не порождает и поэтому не тащит зависимостей от .so.

Absurd ★★★
()

Ждать C++0x когда это сможет быть адекватно реализованно

theos ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.