2015-02-22 1 views
1

template instantiation check for member existing in class объясняет, как проверить, существует ли член класса в шаблоне. Однако, учитывая набор процессов в коммутаторе (NOT), есть способ обращения с чеком-членом. Он должен быть похож на нечто подобное. Обратите внимание, что фактическое определение класса не находится под моим контролем и создается в будущей версии файлов заголовков и библиотек, которые я использую.Элемент класса C++ проверяет, нет ли шаблона

Я знаю, что этот пример препроцессора не сработает, но поскольку это не шаблон, как бы эта обработка была настроена?

case myCase: 
    { 
#ifdef myClass.memberA 
     myClass.memberA varName; 
     // other processing using varName 
#else 
     //Alternate processing 
#endif 
     break; 
    } 
+0

Препроцессор не знает о каких-либо конструкциях C++. Канонический способ делать такие вещи - это использование SFINAE. Другими словами: это невозможно сделать с кодом без шаблонов. –

+0

Если вы посмотрите немного, есть много примеров использования [SFINAE] (http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error), чтобы проверить, существуют ли члены, например [этот старый вопрос] (http: // stackoverflow.com/questions/257288/is-it-possible-to-write-ac-template-to-check-for-a-functions-existence). –

+0

Кстати, почему для кода без шаблонов? – Motti

ответ

2

Вы можете иметь два шаблон перегруженных работ вы хотите:

template<class T> 
void process_myCase(T& obj, std::true_type); 

template<class T> 
void process_myCase(T& obj, std::false_type); 

Затем в case вызове функции со вторым параметром, вычисленного методом вы упоминаете в начале этого вопроса.

Первая перегрузка будет создана для классов с требуемым членом, а вторая перегрузка будет создана для всех остальных.

Я не думаю, что не templated путь будет работать, но опять же, поскольку эти шаблоны могут быть помещены в ваш файл cpp. Я не вижу, какой недостаток для них является шаблонами.

+1

Я вижу в комментарии, что можно настроить шаблон для определения. Тем не менее, нужно было бы создать шаблон с использованием результата для выполнения действия. Однако, если я создаю перегрузки как функции, а не как шаблоны, не могу ли я получить ошибку компилятора? Вопрос в том, как я могу поместить объявление в оператор case без создания шаблона? – sabbahillel

+0

С другой стороны, вы можете быть правы, поскольку эти методы не являются шаблонами, которые они должны быть скомпилированы (даже если они впоследствии будут отброшены). Можете ли вы дать ему попробовать и сообщить мне, что происходит? – Motti

+0

@sabbahillel Я обновил свой ответ, чтобы создать шаблоны перегрузок. Мне жаль, что это не соответствует ограничениям вашего вопроса, но это лучшее, что я могу придумать :( – Motti