【问题标题】:Is there a way to disable member function in a template class in c++ for visual studio 2010 ( no default function template params )有没有办法在 Visual Studio 2010 的 C++ 模板类中禁用成员函数(没有默认函数模板参数)
【发布时间】:2018-11-21 17:03:10
【问题描述】:

例如

#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 的相同任务?

【问题讨论】:

  • 对于 false 的无法编译的模板特化怎么办?
  • 我不太清楚你的意思抱歉。
  • 标签调度/完全专业化/或CRTP
  • 您可以在 void DoStuff(){} 中使用某种 static_assert 创建 Foo 的特化。或者就像@NathanOliver 说的那样做)
  • @jesper 遗留代码与付费客户的遗留支持合同。也就是现实世界。

标签: c++ visual-studio-2010 enable-if


【解决方案1】:

你可以像这样专门化整个班级

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();
}

【讨论】:

  • 如果我只有一种我想禁用的方法和 50 种标准方法,那么专业化整个课程是很困难的。但无论如何都是一个有用的答案。
  • @bradgonesurfing 在这种情况下,您可以利用继承。将所有常见功能放在一个基础上,并专门针对差异。这将节省大量的代码复制(这是 DRY 方式)。
【解决方案2】:

您可以通过 SFINAE 丢弃 DoStuff:

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() {}
};

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2018-12-16
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多