Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 专门化模板成员函数以不同的方式处理特殊模板类_C++_Templates_Template Specialization - Fatal编程技术网

C++ 专门化模板成员函数以不同的方式处理特殊模板类

C++ 专门化模板成员函数以不同的方式处理特殊模板类,c++,templates,template-specialization,C++,Templates,Template Specialization,我有两个类,A类和B类,它们都是A中成员函数的模板类,我希望当A的类型是B时,它能以一种特殊的方式工作 对于任何其他类型的人,我都不知道该怎么做 template <class B> class B { private: T m; public: ...... any member functions } template <class T> class A { private: T var; public: void doSomething(); };

我有两个类,A类和B类,它们都是A中成员函数的模板类,我希望当A的类型是B时,它能以一种特殊的方式工作 对于任何其他类型的人,我都不知道该怎么做

template <class B>
class B
{
private:
  T m;
public:
  ...... any member functions
}

template <class T>
class A
{
private:
  T var;
public:
  void doSomething();
};
template <class T>
void A<T>::doSomething(){...........//implementation}
template <class T> 
void A<B<T>>::doSomething(){................//different implementation}
模板
B类
{
私人:
T-m;
公众:
……任何成员职能
}
样板
甲级
{
私人:
T-var;
公众:
无效剂量();
};
样板
void A::doSomething(){………..//实现}
样板
void A::doSomething(){…………//不同的实现}

您可以通过以下方式专门化
A

template <class T>
class A<B<T>> {
   // ...
};
模板
甲级{
// ...
};
这是一个例子


如果您拒绝专门化整个类,您可以将工作从
A::doSomething()
推迟到将部分专门化的函数
doSomethingForA(A&)
,该函数可能是
A

的朋友,希望这能解决您的问题:

#include <iostream>

template <typename T>
struct B {};

template <typename T> struct A;

template <typename T>
void doSomething(T&) { std::cout << "General\n"; }
template <typename T>
void doSomething(A<B<T>>&) { std::cout << "Special\n"; }

template <typename T>
struct A {
  void doSomething() {
    ::doSomething(*this);
  }  
};

int main()
{
    A<int> general;
    A<B<int>> special;
    general.doSomething();
    special.doSomething();
}
#包括
样板
结构B{};
模板结构A;
样板

无效剂量(T&){std::可以只专门化函数而不是整个类吗?@EkleogAFAICT,对不起,你不能直接这样做。一种方法是将工作推迟到一个单独的函数,你可以部分专门化。我刚刚编辑了我的答案以添加此信息。AFAICT,你也不能部分专门化一个自由函数。你可以n重载它。我怎么能重载它来处理这个特定类型?@LingxiSee的公认答案。它也回答了你的问题。你不是已经问过这个问题了吗()?是的,但它被误解了,所以我试图用不同的方式来重塑它。两个答案都不起作用@JamesAdkisonI不明白这个问题有什么不同,但不管怎样,这里的答案与你已经收到的答案相同,并且在@Lingxi的帖子中提到过。这两个问题的形状不同,它们是针对同一个问题的,但是一开始我以为凌西说的是解决方案,后来我试着用它失败了。你的解决方案是一样的,但你没有解释清楚,但不管怎样都没有解决我的问题@JamesAdkisonIt有效(Y)但是它可以接受任何其他参数吗?或者仅仅是T&和A&?@LingxiI有一个问题,我想处理类数据成员,就好像这些函数是成员函数一样。我如何才能做到这一点@Lingxi@FakhreldinMohamed您可以通过几种方式来完成。例如:将要修改的状态传递给执行修改的函数,传递实例使执行更改的函数成为朋友,等等。这两种解决方案都不起作用。问题是我需要函数成为成员函数,而不是调用setter或getter,甚至不是朋友。@Jamesadkisonth这些是您可用的解决方案,如果您不能使用它们,您可以专门化整个类。无需更多sp具体来说,我们不能说你为什么不能找到工作的答案,但可以告诉你如何让它工作。