Как условно скомпилировать элемент на основе шаблона класса

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

// T is a mathematical type
template <typename T>
class Foo {
public:
    // when zero is not clearly defined
    void bar(T a, T b, T zero) {

    }

    // only makes sense if 0 can be cast to T
    // will fail otherwise
    void bar(T a, T b) {
        bar(a, b, 0);
    } 
}
  • Я использую VS2012, поэтому, к сожалению, нет параметров шаблона члена по умолчанию. :(

Каков наилучший способ добиться того, чего я хочу?


person PythonNut    schedule 09.06.2014    source источник
comment
Вы имели в виду шаблонные специализации? Я не могу получить то, что вы на самом деле просите :/ ...   -  person πάντα ῥεῖ    schedule 09.06.2014
comment
Хм... это проблема...   -  person PythonNut    schedule 09.06.2014
comment
Вам нужно показать нам минимальный пример кода.   -  person quantdev    schedule 09.06.2014
comment
Может быть, это поможет: Условный выбор типа с использованием C++ специализации шаблона   -  person πάντα ῥεῖ    schedule 09.06.2014
comment
Я не думаю, что это то, что я после. Я ищу что-то вроде SFINAE.   -  person PythonNut    schedule 09.06.2014
comment
Да, шаблонные специализации определенно будут вашим единственным вариантом. #ifdef — это препроцессорный макрос, поэтому он будет оцениваться до типов шаблонов и, следовательно, до автоспециализаций.   -  person aruisdante    schedule 09.06.2014
comment
Я думаю, вы могли бы оставить код, как вы его показываете. Ошибка компиляции будет только в том случае, если кто-то попытается использовать второй bar. static_assert во втором bar может сделать сообщение об ошибке более очевидным.   -  person aschepler    schedule 09.06.2014
comment
@PythonNut 'Я не думаю, что это то, что мне нужно' Это в значительной степени соответствует основам SFINAE IMHO.   -  person πάντα ῥεῖ    schedule 09.06.2014
comment
Возможно, вы можете проверить std::enable_if: en.cppreference.com/w/cpp/types /enable_if   -  person Peregring-lk    schedule 09.06.2014
comment
Проверьте дубликат, пример, который я использовал в ответе, очень похож на вашу проблему.   -  person Manu343726    schedule 09.06.2014
comment
@πάνταῥεῖ Код в вашей ссылке вообще не использует SFINAE.   -  person aschepler    schedule 10.06.2014