假设我们有一个双参数化模板
template<class A, class B>
class Class { .... };
Run Code Online (Sandbox Code Playgroud)
并且特定A和特定的特殊化B
template<class B> class Class<A1,B> { .... };
template<class A> class Class<A,B1> { .... };
Run Code Online (Sandbox Code Playgroud)
现在,当我必须实例化Class<A1,B1>编译器时,由于它找到<A,B1>并且<A1,B>同样可用,所以会抱怨模糊性.
当然可以通过添加特化来消除问题<A1,B1>,但是在我的上下文中 - 它将是相同的<A1,B>.
有没有办法消除歧义而不重复整个<A1,B>完整的代码?
Col*_*mbo 12
一种可能性是简单地禁止选择第二个专业化:
template<class A, class B, class=void>
class Class {};
template<class B>
class Class<A1,B> {};
template<class A>
class Class<A, B1, typename std::enable_if<!std::is_same<A,A1>::value>::type> {};
Run Code Online (Sandbox Code Playgroud)
演示.
我将第三个默认参数添加到基本模板,并允许通过SFINAE获取每个专业化:
template<class A, class B,
class extra = void /* Enable/disable specialization through SFINAE */>
class Class { public: void hello() {std::cout << "Base" << std::endl;} };
template<class B> class Class<A1, B> {
public:
void hello() {std::cout << "First" << std::endl;}
};
template<class A> class Class<A, B1,
typename std::enable_if<!std::is_same<A, A1>::value>::type> {
public:
void hello() {std::cout << "Second" << std::endl;}
};
int main()
{
Class<A1,B1> obj;// The first one is picked up
obj.hello();
Class<A,B1> obj2; // The second one is picked up
obj2.hello();
Class<A,B> obj3; // Base
obj3.hello();
}
Run Code Online (Sandbox Code Playgroud)
甚至更简单(取决于你的用例是否可以接受):
template<class A, class B, bool AisA1 = std::is_same<A,A1>::value>
class Class { public: void hello() {std::cout << "Base" << std::endl;} };
template<class B> class Class<A1, B, true /* Pick this when A == A1 */> {
public: void hello() {std::cout << "First" << std::endl;}
};
template<class A> class Class<A, B1, false> {
public: void hello() {std::cout << "Second" << std::endl;}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |