gpt4 book ai didi

c++ - 关于类模板和函数模板SFINAE的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:35 24 4
gpt4 key购买 nike

我尝试为 STL 容器专门化模板(函数或类)。我使用的标准是 c++14。

对于模板函数,我尝试了如下代码。

template<typename... Args>
using int_t = int;

template<typename T, int_t
<
typename T::value_type, //has defined the element type
typename T::iterator, //has defined the iterator
decltype(std::declval<T>().size()) //has defiend the "size()" function
//other check...
> = 0>
void container_handler()
{
}

我认为如果“int_t”中不存在任何类型,模板函数将不会被实例化,但是当我如下调用模板函数时不会发生编译错误。

container_handler<int>();

但是,我在使用类模板时得到了不同的结果。

template<typename... Args>
using int_t = int;

template<typename T , typename = int>
struct ContainerHandler;

template<typename T>
struct ContainerHandler<T, int_t
<
typename T::value_type, //has defined the element type
typename T::iterator, //has defined the iterator
decltype(std::declval<T>().size()) //has defiend the "size()" function
//other check...
>>
{
};

上面的代码有效,当我用没有定义特殊类型或函数的类型实例化类模板时发生编译错误。

ContainerHandler<int> handler1; //compile error
ContainerHandler<int, int> handler2; //compile error
ContainerHandler<vector<int>> handler3; //ok
ContainerHandler<vector<int>, int> handler4; //ok

这里的“int_t”在c++17中可以用“void_t”代替。我的问题是为什么 SFINAE 规则不同于函数模板和类模板。对于函数模板,我尝试了另一种方法,它起作用了。

template<typename... Args>
struct type_container
{
using int_t = int;
};

template<typename T, typename type_container
<
typename T::value_type, //has defined the element type
typename T::iterator, //has defined the iterator
decltype(std::declval<T>().size()) //has defiend the "size()" function
//other check...
>::int_t = 0>
void container_handler()
{
}

container_handler<int>(); //compile error
container_handler<int, 0>(); //compile error
container_handler<vector<int>>(); //ok
container_handler<vector<int>, 0>(); //ok

我不知道使用“int_t”和“type_container::int_t”有什么区别。

最佳答案

下面两行失败的原因是没有定义ContainerHandler这将使具有这些模板参数的模板实例化成功。

ContainerHandler<int> handler1; //compile error
ContainerHandler<int, int> handler2; //compile error

如果您要为模板提供定义,例如像这样:

template<typename T , typename = int>
struct ContainerHandler {};

编译成功。参见 demo here .

编辑:

No. I expect to get a compile error when invoke the template function "container_handler();" (at the first part of the codes).

int_t container_handler 的参数有一个默认值,这就是它编译 container_handler<int>(); 的原因没有默认值会导致编译失败。
参见 demo here .

关于c++ - 关于类模板和函数模板SFINAE的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54883252/

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