gpt4 book ai didi

c++ - 检查类型 T 是否有成员函数 SFINAE 的任何重载

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:31 25 4
gpt4 key购买 nike

<分区>

考虑以下情况,我想检查传递给其他函数 sf 的类型是否具有 所需的成员函数 T::mf >sf,我知道返回类型和名称,但可以通过任意数量的重载。

经过一些修补(这很有趣..)和谷歌搜索,我可以得到类似下面代码的东西,问题是我不知道如何表达 print 可以有可变数量的参数。

#include <type_traits>
#include <utility>


template <typename T,typename = void>
struct has_write : std::false_type {};

template <typename T>
struct has_write<T, decltype(std::declval<T>().write())> : std::true_type {};


template <typename T, typename R = void , typename ...Args>
struct has_print : std::false_type {};

// cant deduce, specialization never used
template <typename T, typename ...Args>
struct has_print<T, decltype(std::declval<T>().print(std::declval<Args>()...))> : std::true_type {};


struct Foo {
void write();
};

struct Bar {
int print(int, float, int);
};

int main(){
static_assert(has_write<Foo>::value, "Does not have write..");
static_assert(has_print<Bar>::value, "Does not have print..");
return 0;
}

上面用 g++ 编译但是第二个 assert 失败了,clang 更有用,告诉我 的特化>has_print 将永远不会被使用,因为它无法推断出所有类型。

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