c++打破模板专业化歧义
c++ break template specialization ambiguity
我一直在阅读C++模板元编程并做其中包含的练习,遇到了一个问题。这个小例子可以看出问题的核心:
template <class A, class B>
struct C;
template <class A>
struct C<A,A>
{
typedef some_type type;
};
template <class A, class B>
struct C<A*,B>
{
typedef some_other_type type;
};
int main()
{
C<int*,int*> c;
}
这无法编译,因为c的类型不明确。编译器无法判断它应该实例化哪个专门化,但是,我知道在这种情况下,我希望调用第一个专门化。到目前为止,我想出的解决方案是像这个一样重写它
template <class A, class B>
struct C;
template <class A, class B>
struct C<A*,B>
{
typedef typename boost::mpl::if_c<boost::is_same<A*,B>::value,
some_type, some_other_type>::type type;
};
这个解决方案的问题是,我实际上对指针、const、引用和数组类型中的每一种都有部分专门化,所以我不得不单独对每个专门化添加这个检查。
那么,我的问题是,是否有一些方法可以实现以前的紧凑专业化,并以某种方式对其进行调整,以便编译器实例化专业化
template <class A>
struct C<A,A>
{
typedef some_type type;
};
而不是任何其他专业,以防出现歧义?
对于那些感兴趣的人来说,我正在研究的问题是第二章的问题1。
您可以向基本模板添加另一个参数,并使用它来启用/禁用您的专业化。例如,您可能有:
template< class A, class B, class Enable = void >
struct C;
template< class A >
struct C<A, A, void> {...};
template< class A, class B >
struct C<A*, B, typename boost::disable_if<boost::is_same<A*, B> >::type> {...};
现在,如果您想处理const指针或其他任何事情,您可以根据类型特征(is_const
,is_pointer
,…)扩展您的条件!
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 构造对象的歧义
- 类模板的成员功能的定义在单独的TU中完全专业化
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- 数组初始值设定项的构造函数歧义
- "专业化不参与超载"
- 消除好友和成员二进制运算符的歧义
- 特定好友功能专业化
- 用' . '代替' :: '会在C++中造成歧义吗?
- 为什么下面带有非常量转换函数的代码没有歧义?
- 是否可以混合使用SFINAE和模板专业化?
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- c++打破模板专业化歧义