gpt4 book ai didi

c++ - sfinae 是否实例化了一个函数体?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:31 27 4
gpt4 key购买 nike

我想使用通常的 SFINAE 技巧检测类的特定成员函数是否存在。

template<typename T>
struct has_alloc
{
template<typename U,U x>
struct dummy;

template<typename U>
static char test(dummy<void* (U::*)(std::size_t),&U::allocate>*);
template<typename U>
static char (&test(...))[2];
static bool const value = sizeof(test<T>(0)) ==1;
};

应该注意的是,这会检测到一种不同类型的分配器,它具有 void* allocate(std::size_t)作为非标准的成员函数(可能是一些原始内存分配器)。

接下来,我有一个不完整的类型和一个不完整类型的 std::allocator。

struct test;
typedef std::allocator<test> test_alloc;

我正在检查 test_alloc 是否是我正在寻找的那个。

struct kind_of_alloc
{
const static bool value = has_alloc<test_alloc>::value;
};

当然struct test当我“使用”test_alloc 时将完成比如

#include "test_def.hpp"//contains the code posted above
struct test{};

void use()
{
test_alloc a;
}

在另一个编译单元中。然而,当 has_alloc 测试发生时,编译器尝试实例化 std::allocator 的分配函数,发现函数体内使用了不完整类型的 size,并导致硬错误。 如果分配的实现分离并在使用时单独包含,似乎不会发生错误,例如

template<typename T>
T* alloc<T>::allocate(std::size_t n)
{
return (T*)operator new(sizeof(T)*n);
}
void use()
{
test_alloc a;
a.allocate(2);
}

test_def.hpp包含

template<typename T>
struct alloc
{
T* allocate(std::size_t n);
};

然而,虽然我可以为 alloc<T> 做到这一点, std::allocator 是不可能的因为分离实现是不可能的。我正在寻找的是可以用 void* allocate(size_t) 来测试一个函数是否存在存在于 test_alloc .如果不是,它将测试为阴性,如果是,即如果函数签名匹配,即使不能在那里实例化,测试也是肯定的。

最佳答案

不,SFINAE 仅在重载决议期间有效。一旦做出决定并且编译器开始实例化函数 SFINAE 就结束了。

编辑:并获取函数的地址以实例化它。

关于c++ - sfinae 是否实例化了一个函数体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3071785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com