gpt4 book ai didi

c++ - 如果模板类型是可实例化的,则执行某些操作

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

如果我可以实例化某个模板类,我想使用 SFINAE 模式来执行一些代码。让我们想象一下:

//Only instantiable with types T for which T.x() is ok:
template <class T>
class TemplateClass
{
T t;
public:
void foo() {
t.x();
}
}

template <class T>
class User
{
void foo()
{
"if TemplateClass<T> is ok then do something else do nothing"
}
}

我该怎么做?

非常感谢!

编辑:基于我尝试过的 edA-qa mort-ora-y 的回答:

template <class T>
struct TemplateClass
{
T t;
void foo() { t.x(); }

static const bool value = true;

};
struct A {};
struct B { void x() {} };

template <class T>
struct User
{
template<typename M>
typename boost::enable_if<TemplateClass<M> >::type func( )
{
std::cout << "enabled\n";
}

template<typename M>
typename boost::disable_if<TemplateClass<M> >::type func( )
{
std::cout << "disabled\n";
}


void foo()
{
func<TemplateClass<T> >();
}

};

User<A> a;
a.foo();

User<B> b;
b.foo();

但这会返回“enabled enabled”。我错过了什么?

最佳答案

你应该看看 boost boost/utility/enable_if.hpp header 和关联的元/模板编程代码。

这里最简单的方法是拥有两个版本的 foo 函数,都是模板函数。其中一个函数将使用 enable_if 结构,另一个将使用 disable_if 结构。

我相信您可以在 boost 网站上找到更好的示例,但像这样:

template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }

只有在 Template 是有效类型时才会定义此函数。因为你总是想编译你需要对应的函数,当它无效时要调用的函数:

template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }

我不确定您是否可以在单个模板中在此模式中定义两个成员函数,而无需将它们都设为模板函数。我想您可以定义两个模板函数并将默认模板参数设置为 T。

希望对您有所帮助。

关于c++ - 如果模板类型是可实例化的,则执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095188/

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