gpt4 book ai didi

c++ - 使用 SFINAE 检查是否存在非硬连线成员函数

转载 作者:行者123 更新时间:2023-11-30 01:28:39 25 4
gpt4 key购买 nike

我想为成员函数和运算符创建代理。它们必须具有相同的返回类型和参数,并且必须适用于作为模板参数给出的多个类。即使该类没有特定的成员函数或运算符,我也希望它能够编译而不是因错误而失败,本质上是 SFINAE。如果X有一个方法 f()Y没有任何名为 f 的方法, 我需要 Proxy<X>有一个f()以及调用X::f() ,我需要 Proxy<Y>编译和实例化没有任何问题。

previous question of mine 之后,从已知函数中提取返回类型不再是问题。 .但是,如果没有这样的功能,它会失败并出现错误。

我已经知道几个模板元编程技巧来确定给定函数是否存在,如果存在则启用某个功能,但是,它们都只适用于硬连线函数名称而不是任意名称,这严重限制了它们在这种情况下的使用因为我需要相同的结构来实现多个功能。

我只需要检查是否存在任何具有给定名称的函数,如果有重载变体我不需要检查是否存在特定的变体,自动模板推导解决了这个问题(或者我希望如此)

我当前的代码如下所示:

template <class T>
class Proxy
{

// using my resultof solution
template <class... Args>
resultof(T::f, Args...) f (Args... x)
{
return x.f(x...);
}

// using another return type extraction solution
template <class... Args>
typeof(T::f(std::declval<Args>()...)) f (Args... x)
{
return x.f(x...);
}

T x;

};

即使 T 没有任何名为 f 的函数,它也应该编译。不幸的是,这两个版本都因错误而失败。

resultof being的实现

#define resultof(f, ...) typeof(Param<__VA_ARGS__>::Func(f))

template <class... Args>
class Param
{

public:

template <class R>
static R Func (R (*) (Args...));

template <class R, class C>
static R Func (R (C::*) (Args...));

template <class R, class C>
static R Func (R (C::*) (Args...) const);

};

最佳答案

我怀疑

template<typename... Args>
decltype( std::declval<T&>().f(std::declval<Args>()...) )
f(Args&&... args)
{
return x.f(std::forward<Args>(args)...);
}

应该触发 SFINAE 并丢弃 f 的任何实例化其返回类型格式错误(例如,不明确或不存在的重载)而不是硬错误。我不太确定,因为 Tproxy的一个参数, 不是 f而且我根本无法解析标准的相关部分(我相信大约是 14.8.2)。非规范性注释中提供的示例似乎都不适用。

否则,可以使用

template<typename U = T&, typename... Args>
decltype( std::declval<U>().f(std::declval<Args>()...) )
f(Args&&... args)
{
return x.f(std::forward<Args>(args)...);
}

我的编译器很乐意接受 proxy<int> p; ,与第一个选项不同。 p.f();导致“未找到匹配的函数”错误,这在 SFINAE 中很常见。


我建议尽可能使用运算符的独立形式:

template<typename T, typename U>
auto operator+(Proxy<T> const& lhs, Proxy<U> const& rhs)
-> decltype( std::declval<T const&>() + std::declval<U const&>() )
{
return lhs.x + rhs.x;
}

有可能。

关于c++ - 使用 SFINAE 检查是否存在非硬连线成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7279416/

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