【问题标题】:How to have a member function implementation dependent on class' template parameter? [duplicate]如何让成员函数实现依赖于类的模板参数? [复制]
【发布时间】:2018-03-26 18:23:09
【问题描述】:

这是我最好的尝试:

#include <iostream>

template <bool EnableSomething = false>
class MyClass
{
    typename std::enable_if< EnableSomething >::type
        something(int& x)
    {
        x += 1; //do something
    }

    typename std::enable_if< !EnableSomething >::type
        something(int& x)
    {
        // do nothing, should be optimized away
    }

public:
    void Process()
    {
        int x = 0;
        something(x);
        std::cout << "Enabled: " << EnableSomething << ".  x = " << x << std::endl;
    }
};

int main()
{
    MyClass<true> yes;
    MyClass<false> no;
    yes.Process();
    no.Process();
    return 0;
}

编译器说: tester.cpp(12): error C2039: 'type': is not a member of 'std::enable_if&lt;false,_Ty&gt;'

【问题讨论】:

  • 这对于if constexpr 来说似乎是一个很好的例子,但是在c++ 11 中你需要编写常规的成员函数模板。
  • 首先,确保包含type_traits。其次,不能根据返回类型重载。
  • 这是根本错误的。 SFINAE 基于论据推导和替换,因此“失败不是错误”。这里根本不扣分。
  • 这不应该被标记为重复,从@VT_T 的回答中可以看出一点不同的问题。

标签: c++ c++11 enable-if


【解决方案1】:

使用从父模板获取的默认参数制作常规模板:

template<bool x_enabled = EnableSomething> 
typename std::enable_if< x_enabled >::type
something(int& x)
{
    x += 1; //do something
}

template<bool x_enabled = EnableSomething> 
typename std::enable_if< !x_enabled >::type
something(int&)
{
    // do nothing, should be optimized away
}

有了 c++17,事情就变得简单了:

void
something(int& x)
{
    if constexpr(EnableSomething)
    {
        x += 1; //do something
    }
}

【讨论】:

  • 使用 c++17 something 是不需要的。只需在Process() 中执行if constexprsomething 是缺少 if constexpr 的解决方法。
猜你喜欢
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多