gpt4 book ai didi

c++ - enable_if'ed 模板化模板构造函数的类型签名?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:04 24 4
gpt4 key购买 nike

我通常先声明我的类和模板,然后再定义它们的方法(当然是在同一个头文件中)。我只是觉得这样更容易阅读。好吧,我遇到过这样一种情况,我无法找出在类外定义中使用的有效类型签名。这是我正在做的一个简化示例,它说明了问题:

template <class T>
struct Foo
{
Foo(T a, T b);

template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
( Iterator first
, Iterator last
);
};

template <class T>
Foo<T>::Foo(T a, T b)
{ ... }

template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }

我在 WHAT_GOES_HERE 槽中尝试了很多方法来尝试获得匹配的签名,但我一直失败。我需要 enable_if 来区分一个传入两个 T 类型对象的情况,以及一个传入一对迭代器的情况。如果模板化构造函数是在主模板内定义的,代码就可以正常工作,这就是代码当前的工作方式,但我更愿意将定义移到声明之外。

编辑: 我应该提一下,我不能只是在定义中重复使用 enable_if<...>,因为 enable_if<...> 为其类型分配了一个默认值,这您不能在既不是声明又是声明的定义中执行操作。

最佳答案

我不会那样做的。以下是我要进行的更改:

template <class T>
struct Foo
{
Foo(T a, T b);

template
< class Iterator
>
Foo
( Iterator first
, Iterator last
, typename enable_if<is_iterator<Iterator> >::type* = 0
);
};

template <class T>
Foo<T>::Foo(T a, T b)
{ ... }

template <class T>
template
< class U
>
Foo<T>::Foo(U f, U l, typename enable_if< is_iterator<U> >::type*)
{ ... }

这直接来自 enable_if 的文档。

关于c++ - enable_if'ed 模板化模板构造函数的类型签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135651/

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