Проверка типа времени компиляции C ++ - PullRequest
4 голосов
/ 12 ноября 2011

Я создал список типов. Затем я создаю класс, используя шаблон, передавая список типов. Когда я вызываю функцию печати класса с некоторыми не указанными типами, они преобразуются. Как я могу обеспечить точный тип во время компиляции? Поэтому, если я использую незарегистрированный тип, я получаю ошибку компилятора. Благодарю.

template <class T, class U>
struct Typelist
{
   typedef T Head;
   typedef U Tail;
};


class NullType
{
};

typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes;

template<class T>
class MyClass
{
    public:
    void print(T::Head _Value) { std::cout << _Value; }
    void print(T::Tail::Head _Value) { std::cout << _Value; }
    void print(T::Tail::Tail::Head _Value) { std::cout << _Value; }
    private:
};


MyClass<UsableTypes> testclass;

void TestMyClass()
{
    int int_val = 100000;
    float flt_val = 0.1f;
    char* char_val = "Hi";
    short short_val = 10;
    std::string str_val = "Hello";

    testclass.print( int_val ); // OK  8-)
    std::cout << endl;
    testclass.print( flt_val ); // OK  8-)
    std::cout << endl;
    testclass.print( char_val ); // OK  8-)
    std::cout << endl;
    testclass.print( short_val); // this compiles OK and works ???  8-(
    std::cout << endl;
    testclass.print( str_val ); // compile error  8-)
    std::cout << endl;
}

@ Kerrek SB: Привет, я подумал, что это поможет мне с моим следующим шагом - созданием функции печати в зависимости от содержимого t_list, типов и количества типов. Но я изо всех сил пытаюсь разделить обработку времени компиляции и обработку времени выполнения. Я пытаюсь создать функцию печати для каждого типа в списке. Таким образом, если список имеет два типа, будут созданы две функции печати, а если есть пять типов, то будут созданы пять функций печати, по одной для каждого типа. Когда я делаю это:

 typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes;

 MyClass<UsableTypes> newclass

Создает ли это три экземпляра MyClass по одному для каждого типа в списке, или это создает один экземпляр, и мне нужно создать функцию печати для каждого типа? Я чувствую, что у меня в голове почти все блоки, но просто не могу соединить их вместе. Любая помощь, которую вы можете предложить, будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

4 голосов
/ 13 ноября 2011

Добавить шаблон приватной функции

template<typename T> void print(T);

который не нуждается в реализации. Это должно перехватывать все типы, для которых явной печати не существует, и поскольку она является закрытой, она выдаст сообщение об ошибке.

2 голосов
/ 12 ноября 2011

Вы должны превратить вашу print функцию в шаблон, а затем проверить, совпадают ли типы:

template <typename U>
void print(const U & u)
{
  // use std::is_same<typename std::decay<T::Head>::type, typename std::decay<U>::type>::value
}

Здесь я краду is_same и decay из <type_traits>, но если у вас нет C ++ 11, вы можете либо взять их из TR1 или из Boost, либо просто написать их самостоятельно, как это очень простые классы модификаторов типов.

Условное выражение лучше всего использовать в static_assert, который является еще одной функцией C ++ 11, но существуют аналогичные конструкции для C ++ 98/03, которые приводят к ошибке времени компиляции при определенных условиях.

0 голосов
/ 12 ноября 2011

Вы можете получить ваши аргументы по неконстантной ссылке, заставив их быть точно такого же типа. Однако вы больше не можете использовать его с константными переменными или литералами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...