相关疑难解决方法(0)

模板特化和enable_if问题

我遇到了关于enable_if和模板特化的适当用法的问题.

修改示例后(出于保密原因),这是一个类似的例子:

我有一个名为"less"的函数,用于检查1st arg是否小于2nd arg.假设我想根据输入的类型有两种不同的实现 - 一个是整数实现,另一个是double.

到目前为止我的代码看起来像这样 -

#include <type_traits>
#include <iostream>

template <class T,
          class = typename std::enable_if<std::is_floating_point<T>::value>::type>
     bool less(T a, T b) {
  // ....
}

template <class T,
          class = typename std::enable_if<std::is_integral<T>::value>::type>
     bool less(T a, T b) {
  // ....
}

int main() {
    float a;
    float b;
    less(a,b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码没有编译,因为 - 它说我正在重新定义less方法.

错误是:

Z.cpp:15:19: error: template parameter redefines default argument
          class = typename std::enable_if<std::is_integral<T>::value>::type>

                  ^
Z.cpp:9:19: note: previous default template argument defined here …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae enable-if c++11

17
推荐指数
1
解决办法
5886
查看次数

是否有 C++14 替代 C++20 中引入的显式(expr)?

TL;DR:我正在寻找与以下 C++20 MWE 等效的 C++14:

template<int sz>
struct bits {
  int v; // note explicit(expr) below
  explicit(sz > 1) operator bool() const { return bool(v); }
};

int main() {
  bool c = bits<1>{1}; // Should work
  bool d = bits<3>{1}; // Should fail
}
Run Code Online (Sandbox Code Playgroud)

语境:

bits<sz>我们有一个表示长度为位向量的C++ 类sz。过去,对 all 的转换bool是隐式的sz,但事实证明这很容易出错,因此我们改为operator bool()显式转换。

然而,1-bit位向量(在我们的上下文中)几乎完全等同于布尔值,因此当 时最好是operator bool()隐式的sz == 1

explicit(sz > 1)这可以在C++20中实现,但我们的目标是 C++14。

我尝试重载 …

c++ implicit-conversion template-meta-programming c++14 c++20

10
推荐指数
1
解决办法
498
查看次数

如何在转换运算符中使用std :: enable_if?

基本上我希望我的范围类型可以隐式转换Range<const char>Range<const unsigned char>.std :: enable_if似乎不可能,因为该函数不带参数且没有返回.是什么工作?

这基本上是我尝试过的:

template<typename T>
class Range{
    T* begin_;
    T* end_;
public:
    Range(T* begin,T* end):begin_{begin},end_{end}{}
    template<int N>
    Range(T (&a)[N]):begin_{static_cast<T*>(&a[0])},end_{static_cast<T*>(&a[N-1])}{}
    T* Begin(){return begin_;}
    T* End(){return end_;}
    operator typename std::enable_if<std::is_same<T,const char>::value,Range<const unsigned char>&>::Type (){
        return *reinterpret_cast<Range<const unsigned char>*>(this);
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming sfinae enable-if

6
推荐指数
1
解决办法
2361
查看次数