gpt4 book ai didi

c++ - 使用 SFINAE 有选择地实例化模板的成员函数

转载 作者:行者123 更新时间:2023-11-30 03:22:47 24 4
gpt4 key购买 nike

所以在模板类中,我试图根据一些静态提供的信息来实例化不同的成员。在下面的模板中,如果满足某些条件,则 selectiveMember 包含在 SelectiveClass 中,否则,模板将在没有 selectiveMember 的情况下实例化,但是仍然包含 foo

template<typename T>
struct SelectiveClass{

void foo(){...}

template<condition_check<T>::type=0>
void selectiveMember{...}
}

但是,如果不满足条件,这种实现将丢弃整个类。然而,使用CRTP技术,我们可以达到目的。

template<typename T>
struct SelectiveClass: Specialize<T>{
void foo(){...}
}
template<typename T>
struct Specialize{
template<condition_check<T>::type=0>
void selectiveMember{...}
}

但是使用这种技术,每个选择性成员都需要另一个专门的继承。

所以我的问题是:有没有更优雅的方式来允许这种选择性成员模板?

最佳答案

您的 enable_if 不能按您希望的方式工作的原因是因为它没有在直接上下文中使用(例如,参见 here )。但是,如果您在 selectiveMember 函数中插入一个默认模板参数,就可以实现您的需要。在下面的示例中,我使用了 condition 的具体示例,但您可以将其替换为您自己的。

#include <type_traits>


template<typename T>
struct SelectiveClass{

void foo(){}

template <class X = T, std::enable_if_t<std::is_integral<T>::value, X>* = nullptr>
void selectiveMember(){}
};

using test_int = SelectiveClass<int>;
using test_double = SelectiveClass<double>;

int main() {

test_int x;
test_double y;

x.selectiveMember();
// y.selectiveMember(); fails to compile as expected
}

关于c++ - 使用 SFINAE 有选择地实例化模板的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50850029/

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