gpt4 book ai didi

c++ - 前向声明的类型模板可以参与模板特化吗?

转载 作者:行者123 更新时间:2023-11-27 22:59:29 25 4
gpt4 key购买 nike

下面不编译

#include <iostream>
#include <type_traits>

// forward declaration of a type template
template<class T, class Alloc = std::allocator<T>> class std::vector;

template<class T>
struct is_vector : std::false_type { };

// using the forward declared type template
template<class T, class Alloc>
struct is_vector<std::vector<T, Alloc>> : std::true_type { };


#include <vector>

int main()
{
std::cout << is_vector<std::vector<int>>::value << std::endl;
}

我想确保前向声明的类型模板(在 vector 之上)在特化上下文中实际上是不可使用的,并且这不是一个错误的实现。另外为什么会这样?我不想创建 vector<> 类型的对象仅将其用作在特化之间分派(dispatch)的标签; 不包含 <vector>在实例化点就足够了(调用站点 is_vector<> ) ?

最佳答案

标准库容器的前向声明 is undefined behavior (如果你设法编译它),所以对于 std::vector你必须#include <vector>在定义 is_vector 之前.

对于你自己的类型,你可以这样做:

// forward declaration of a type template
namespace my {
template<class T, class Alloc> class vector;
}

template<class T>
struct is_vector : std::false_type { };

// using the forward declared type template
template<class T, class Alloc>
struct is_vector<my::vector<T, Alloc>> : std::true_type { };

namespace my {
template<class T, class Alloc = std::allocator<T>> class vector {};
}

关于c++ - 前向声明的类型模板可以参与模板特化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213205/

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