gpt4 book ai didi

c++ - 如何部分特化非模板类的模板化成员方法?

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

我可以在模板类的部分特化方面找到很多帮助,但我想部分特化非模板类的方法。

class TempMembMeth {
public:
template<typename T1, typename T2>
void templMethod1(int);
};

我的模板化方法实现:

template<typename T1, typename T2>
void TempMembMeth::templMethod1(int){
std::cout << "<T1,T2>templMethod1(int)" << '\n';
}

我可以完全指定该方法:

template<>
inline void TempMembMeth::templMethod1<char,char>(int){
std::cout << "<char,char>templMethod1(int)" << '\n';
}

但是我怎样才能做部分规范呢?

template<typename T2>
inline void TempMembMeth::templMethod1<char,T2>(int){
std::cout << "<char,?>templMethod1(int)" << '\n';
}

我得到:“TempMembMeth::templMethod1”:非法使用显式模板参数我不能用部分特化的方法重新定义类,因为类没有模板化。它也不会让我“重载”类中的模板化方法 - 它再次提示非法使用显式模板参数。

如果这可能的话,有什么想法吗?目前,我通过对类进行模板化来解决这个问题,但我想知道如果没有模板化类是否可行。

最佳答案

正如其他人已经指出的,您不能部分特化函数模板。但是,您可以使用效果几乎相同的辅助类。

#include <iostream>

namespace details
{
// Forward declaration of the helper class.
template<typename T1, typename T2> struct Helper;
}

class TempMembMeth
{
public:

template<typename T1, typename T2>
void templMethod1(int arg)
{
details::Helper<T1, T2>::doit(this, arg);
}
};

namespace details
{
// Implement the helper class and its specializations.
template<typename T1, typename T2> struct Helper
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<T1,T2>::doit()\n";
}
};

template<typename T2> struct Helper<char, T2>
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<char,T2>::doit()\n";
}
};

template<> struct Helper<char, char>
{
static void doit(TempMembMeth* obj, int arg)
{
std::cout << "In Helper<char, char>::doit()\n";
}
};
}

int main()
{
TempMembMeth obj;
obj.templMethod1<float, int>(10);
obj.templMethod1<char, double>(20);
obj.templMethod1<char, char>(30);
return 0;
}

输出:

In Helper<T1,T2>::doit()
In Helper<char,T2>::doit()
In Helper<char, char>::doit()

关于c++ - 如何部分特化非模板类的模板化成员方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571727/

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