gpt4 book ai didi

c++ - 如何仅在派生类具有特定功能时才启用功能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:49 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,我们称它为Base,它以Derived作为模板参数,也是Derived的基类code>,它定义了一个方法if Derived 中的某个方法被定义。

这是我尝试实现这一点的方式(源自对这个问题的回答:How to let a base method be defined only if the derived class does not define a method of the same name)

#include <utility>

struct GetValueImpl
{
template <typename T>
static auto test(int) -> decltype(
std::declval<T&>().GetValue(0),
std::true_type{});
template <typename...>
static std::false_type test(...);
};
template <typename T>
struct GetValueDefined : public decltype(GetValueImpl::test<T>(0)) {};

template <typename Derived, int X>
class Base
{
public:

// I want to define this function only if GetValue is defined in Derived
template <typename... Args>
auto Test(const Args&...) -> typename std::enable_if<GetValueDefined<Derived>::value>::type
{
}
};

template <std::int32_t val>
class DerivedExample : public Base<DerivedExample<val>, 1>
{
public:
template <typename T>
int GetValue() {return 0;}
};

int main() {
DerivedExample<1> d;
d.Test(1, 2);
return 0;
}

这会产生以下编译器错误:

prog.cpp:21:10: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
auto Test(const Args&...) -> typename std::enable_if<GetValueDefined<Derived>::value>::type
^
prog.cpp: In function ‘int main()’:
prog.cpp:36:7: error: ‘class DerivedExample<1>’ has no member named ‘Test’
d.Test(1, 2);
^

working example here .

很明显,我的 std::enable_if 检查失败了。但是为什么?

最佳答案

SFINAE 机制必须依赖于当前模板中的名称。为 Derived 使用默认参数,以便可以发生(不)成功的替换:

template <typename D = Derived, typename... Args>
auto Test(const Args&...) -> typename std::enable_if<GetValueDefined<D>::value>::type
{
}

关于c++ - 如何仅在派生类具有特定功能时才启用功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25071865/

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