c++11 enable_if error
c++11 enable_if error
我看到了以下C++11的enable_if示例:
struct is_64_bit
{
static const bool value = sizeof(void*) == 8;
};
enable_if<is_64_bit::value, void>::type
my_memcpy(void* target, const void* source, size_t n)
{
cout << "64 bit memcpy" << endl;
}
enable_if<!is_64_bit::value, void>::type
my_memcpy(void* target, const void* source, size_t n)
{
cout << "32 bit memcpy" << endl;
}
据我了解,根据系统架构,"my_memcpy"功能将可用于 32 位或 64 位版本。但是我在编译时收到以下错误:
error: ‘type’ in ‘struct std::enable_if<false, void>’ does not name a type
我有点困惑,因为我认为只有 32 版本应该可用(我使用的是 Linux Fedora 32 位)。
也许这个例子有问题?还是我错过了什么?
谢谢。
std::enable_if
通过替换失败不是错误原则 (SFINAE) 工作,该原则指出,当实例化函数模板时发生某些类型的错误时,程序将继续使用该函数模板进行编译,而不参与重载解析。
要使 SFINAE 发挥作用,(a) 它必须用于函数(或方法)模板,(b) 它必须依赖于模板参数。 您的程序在这两个方面都失败了。
要使enable_if
依赖于模板参数,最简单的方法是添加一个默认参数:
template<typename T = void> typename enable_if<is_64_bit::value, T>::type
my_memcpy(void* target, const void* source, size_t n)
然而,这通常不是enable_if
的明智使用;因为它依赖于拦截编译错误,所以它往往是昂贵的。 在您的情况下,模板专用化将是一个更好的主意:
#include <iostream>
template<int = sizeof(void *)> void my_memcpy(void* target, const void* source, size_t n);
template<> void my_memcpy<8>(void* target, const void* source, size_t n) {
std::cout << "64 bit memcpy" << std::endl;
}
template<> void my_memcpy<4>(void* target, const void* source, size_t n) {
std::cout << "32 bit memcpy" << std::endl;
}
template< bool B, class T = void > struct enable_if
是专用的,因此它仅在条件 B true
时才具有typedef type
。
您的编译器是正确的。struct std::enable_if<false, void>
中没有用于type
的类型定义。struct std::enable_if<true, void>
中只有一个 typedef .
有关更多信息,请查看此处。
因此,要解决您的问题,您需要确保计算结果为 false
B 的 enable_if
永远不会被编译。您可以在 SFINAE 的帮助下通过my_memcpy
函数模板来实现这一点。然后,编译器在编译 B 计算结果为 false
的函数模板失败时不会报告错误,并将成功编译并使用 B 计算结果为 true
的函数。
#include <iostream>
#include <type_traits>
using namespace std;
struct is_64_bit
{
static const bool value = sizeof(void*) == 8;
};
template<typename T>
typename enable_if<is_64_bit::value, T>::type
my_memcpy(T* target, const T* source, size_t n)
{
cout << "64 bit memcpy" << endl;
}
template<typename T>
typename enable_if<!is_64_bit::value, T>::type
my_memcpy(T* target, const T* source, size_t n)
{
cout << "32 bit memcpy" << endl;
}
SFINAE 用于模板。您需要的是使用模板,正如其他答案所提到的,或者只是一个编译时分支,IMO 是更合适的解决方案(而不是引入不必要的模板):
struct is_64_bit :
std::integral_constant<bool, sizeof(void*) == 8>
{};
namespace detail
{
void my_memcpy(void* target, const void* source, std::size_t n, std::true_type)
{
std::cout << "64 bit memcpy" << std::endl;
}
void my_memcpy(void* target, const void* source, std::size_t n, std::false_type)
{
std::cout << "32 bit memcpy" << std::endl;
}
}
void my_memcpy(void* target, const void* source, std::size_t n)
{
my_memcpy(target, source, n, is_64_bit());
}
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- 如何解决"if"块中的"Undeclared identifier error"?
- "[Error] expected unqualified-Id before 'if'"这个代码块是什么意思
- 设置if流,获取'error: expected initializer before ‘.’ token'
- 为什么我会得到一个编译错误,上面写着error:“else”而没有前面的“if”