Есть ли способ отключить функцию-член в классе шаблона в C ++ для Visual Studio 2010 (нет параметров шаблона функции по умолчанию) - PullRequest
0 голосов
/ 21 ноября 2018

Например,

#include "boost/type_traits.hpp"
template <bool enable>
struct Foo {

    template <bool e = enable>
    typename boost::enable_if_c<e,void>::type  DoStuff(){}

};

int main(){
    // Compiles
    Foo<true>().DoStuff();
    // Fails
    Foo<false>().DoStuff();
}

будет работать в современных компиляторах, но не в Visual Studio 2010, которая не допускает параметры шаблона по умолчанию для функций / методов.Есть ли другой способ сформулировать ту же задачу, которая будет работать с VS2010?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вы можете отказаться от DoStuff через SFINAE:

template<bool enable>
struct Foo {
private:
    static void SFINAE_Helper(std::true_type);
    typedef std::integral_constant<bool, enable> tag;
public:
    decltype(SFINAE_Helper(tag())) DoStuff() { }
};

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

РЕДАКТИРОВАТЬ

Альтернатива может выглядеть следующим образом:

template<bool enable>
struct Foo {
private:
    typedef std::enable_if<enable> enable_tag;
public:
    typename enable_tag::type DoStuff() {}
};
0 голосов
/ 21 ноября 2018

Вы можете специализировать весь класс как

template <bool enable>
struct Foo {};

template <>
struct Foo<true> {
    void DoStuff(){}
};

template <>
struct Foo<false> {

};

А потом

int main(){
    // Compiles
    Foo<true>().DoStuff();
    // Fails
    Foo<false>().DoStuff();
}
...