gpt4 book ai didi

c++ - 部分模板特化的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:31 24 4
gpt4 key购买 nike

我有以下类结构

// file foo.h:

struct foo_base
{ ... }

template<typename T> struct foo : foo_base
{ ... };

template<typename F>
using is_foo = std::is_convertible<F,foo_base>;

template<typename, typename=void> struct aux;

template<typename Foo>
struct aux<Foo, typename std::enable_if<is_foo<Foo>::value>::type>
{ ... }; // specialisation for any foo

// file bar.h:
#include "foo.h"

template<typename T> struct bar : foo<T>
{ ... };

template<typename T>
struct aux<bar<T>>
{ ... }; // specialisation for bar<T>

现在,问题是 aux<bar<T>>aux 提供的两个专业是可行的。有没有办法在不为每个 T 提供另一个特化的情况下避免这种歧义? ?请注意,对文件 foo.h 的修改不能知道文件 bar.h .

注意 应解决歧义,以便文件 bar.h 中提供的特化为任何 aux<bar<T>> 选择.原来,bar不是模板和特化 aux<bar>不偏不倚,因此是首选。问题是通过制作 bar 产生的一个模板。

最佳答案

编译器没有看到 struct aux<bar<T>>struct aux<Foo, typename std::enable_if<is_foo<Foo>::value>::type> 更专业因为第二个模板参数。您可以在 bar<T> 中以相同的方式指定第二个参数专业:

template<typename T>
struct aux<bar<T>, typename std::enable_if<is_foo<bar<T>>::value>::type>
{ };

特殊化部分模板特化的规则很复杂,但我会尽量简单地解释一下:

三个(你的两个,加上我的一个)相关专业是

template<typename Foo>
struct aux<Foo, typename std::enable_if<is_foo<Foo>::value>::type>

template<typename T>
struct aux<bar<T>> // or aux<bar<T>, void>
{ };

template<typename T>
struct aux<bar<T>, typename std::enable_if<is_foo<bar<T>>::value>::type>
{ };

根据标准 (14.5.5.2),要确定哪个类模板部分特化是最特化的,需要回答的问题是以下哪个函数模板重载最匹配调用f(aux<bar<T>>()) :

template<typename Foo>
void f(aux<Foo, typename std::enable_if<is_foo<Foo>::value>::type>); // 1

template<typename T>
void f(aux<bar<T>>); // or aux<bar<T>, void> // 2

template<typename T>
void f(aux<bar<T>, typename std::enable_if<is_foo<bar<T>>::value>::type>); // 3

反过来,函数的偏序规则说 1 不比 2 更特化,2 也不比 1 更特化,粗略地说,因为 1 不是清楚比 2 更特化,而 2 并不明显比 1 更特化。“明显更特化”不是标准用语,但这本质上意味着基于其中一个的类型参数,另一个的类型参数不可推导。

然而,当比较 1 和 3 时,1 的参数可以从 3 推导出来:Foo可以推断为bar<T> .因此,3 至少与 1 一样专业。但是,3 的参数不能从 1 推导:T根本无法推断。因此,编译器的结论是 3 比 1 更专业。

关于c++ - 部分模板特化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24126582/

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