gpt4 book ai didi

c++ - 专注于 C++ 模板中的类型子集

转载 作者:太空狗 更新时间:2023-10-29 20:30:40 25 4
gpt4 key购买 nike

我有一个关于 C++ 模板特化的问题,我希望这里有人能提供帮助。我有一个具有 3 个模板参数的类:

template<class A, class B, class C>
class myClass {

public:
void myFunc();
};

我想做的是编写多个版本的 myFunc,专门针对 C 类型,但对于 A 和 B 类型是通用的。所以我不想要像这样的完全模板化的函数:

template<class A, class B, class C>
void myClass<A, B, C>::myFunc()
{
// function code here
}

而且我不想要像这样的完全特化的功能

void myClass<int, int, int>::myFunc()
{
// code goes here
}

相反,我想做一些类似于

的事情
template<class A, class B>
void myClass<A, B, int>::myFunc()
{
// code goes here
}

想法是,如果类类型 C 是 int,我将调用一个版本的 myFunc(),如果类类型 C 是 double,我将调用另一个版本的 myFunc。我已经尝试了很多模板特化语法的不同组合(太多无法在此处列出),但似乎没有一个可以编译。

有人能给我指出正确的方向吗?预先感谢您的帮助。

迈克尔

最佳答案

您可以编写函数模板和重载,并将工作委托(delegate)给它:

template<class A, class B, class C>
class myClass
{
//resolver doesn't need to define anything in it!
template<class> struct resolver {}; //empty, yet powerful!
public:
void myFunc()
{
doFun(resolver<C>());
}

//this is a function template
template<typename X>
void doFun(const resolver<X> & )
{
//this function will get executed when C is other than int
//so write your code here, for the general case
}

//this is an overload, not a specialization of the above function template!
void doFun(const resolver<int> & )
{
//this function will get executed when C = int
//so write your code here, for the special case when C = int
}
};

注意一个重点:doFun(const resolve<int>& )是一个重载函数,它不是函数模板的特化。您不能在不专门化封闭类模板的情况下专门化成员函数模板。

阅读这些文章:

关于c++ - 专注于 C++ 模板中的类型子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6229013/

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