Частичная специализация шаблона - передача типов в качестве аргументов? - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь написать оболочку для вызовов в форме typeid()==typeid(), чтобы предотвратить передачу указателей / типов указателей в качестве аргументов (ошибка легко возникает и ее трудно обнаружить).

Так что теперь, когда вызов будет typeid(ClassA)==typeid(arg), я бы хотел заменить его на safesametype(ClassA, arg) или что-то подобное. Затем следует проверить во время компиляции, действительно ли ни один из двух аргументов не ссылается на указатели.

Используя функциональность библиотеки Loki, я попал почти туда, но не совсем. В настоящее время я могу сделать звонок safesametype<ClassA, SuperClassOfA>(arg), где SuperClassOfA - это тип arg.

У кого-нибудь есть идеи, как я могу отказаться от спецификации SuperClassOfA? Это текущий источник:

#include "loki/NullType.h"
#include "loki/TypeTraits.h"
#include "loki/static_check.h"
#include <typeinfo>

class CannotCompareTypeIDofPointers{};

template<class T, class T2>
bool safesametype(const T& object){
    LOKI_STATIC_CHECK(not Loki::TypeTraits<T>::isPointer, InvalidTypeIDCheck);
    LOKI_STATIC_CHECK(not Loki::TypeTraits<T2>::isPointer, InvalidTypeIDCheck);
    return typeid(object)==typeid(T2);
}

Заранее спасибо!

Broes

(PS, пожалуйста, никаких решений, говорящих мне не использовать typeid)

1 Ответ

3 голосов
/ 11 октября 2011

Просто поменяйте местами параметры шаблона.

template <class TestType, class ArgType>
bool instanceof(const ArgType& object) {
    // checks here
    return typeid(TestType) == typeid(object);
}

Вызовите как:

instanceof<ClassA>(arg)
...