首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当返回值为类或class<class>或class<class、class>等时,如何使用class<class?

当返回值为类或class<class>或class<class、class>等时,如何使用class<class?
EN

Stack Overflow用户
提问于 2014-07-16 16:32:23
回答 1查看 235关注 0票数 1

以下简化类在从get()返回值时会执行不同的操作,这取决于类是作为模板参数被赋予了一个double还是一个数组:

代码语言:javascript
复制
#include "array"
#include "type_traits"

template<class T> class C
{
public:
    T get(const int arg) {
        return this->impl<T>(arg);
    }

private:
    template<class Out_T> typename std::enable_if<
        std::is_same<Out_T, double>::value,
        Out_T
    >::type impl(const int arg) { return 1; }

    template<class Out_T> typename std::enable_if<
        std::is_same<Out_T, std::array<double, 3>>::value,
        Out_T
    >::type impl(const int arg) { return {1, 2, 3}; }
};

int main(int argc, char* argv[])
{
    C<double> c1;
    C<std::array<double, 3>> c2;

    return c1.get(0) < c2.get(0)[1];
}

我应该如何编写impl的数组版本,以便支持数组中的任意数量的项?g++-4.8.2和clang++-3.5的误差不明显。我认为我最近得到的是:

代码语言:javascript
复制
    template<
        template<class...> class Out_T,
        class... Args
    > typename std::enable_if<
        std::is_same<Out_T<Args...>, std::array<Args...>>::value,
        Out_T<Args...>
    >::type impl(const int arg) { return {1, 2, 3}; }

但克朗仍在抱怨:

代码语言:javascript
复制
testi.cpp:8:20: error: no matching member function for call to 'impl'
                return this->impl<T>(arg);
                       ~~~~~~^~~~~~~
testi.cpp:31:28: note: in instantiation of member function 'C<std::__1::array<double, 3> >::get' requested
      here
        return c1.get(0) < c2.get(0)[1];
                              ^
testi.cpp:13:7: note: candidate template ignored: disabled by 'enable_if' [with Out_T =
      std::__1::array<double, 3>]
                std::is_same<Out_T, double>::value,
                ^
testi.cpp:23:14: note: candidate template ignored: invalid explicitly-specified argument for template
      parameter 'Out_T'
        >::type impl(const int arg) { return {1, 2, 3}; }
                ^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 16:43:50

将模板声明更改为:

代码语言:javascript
复制
template<
    template<class...> class Out_T,
    class... Args
>

代码语言:javascript
复制
template<
    class Out_T
>

并将返回类型更改为:

代码语言:javascript
复制
typename std::enable_if<
    detail::is_standard_array<Out_T>::value,
    Out_T
>::type

其中,is_standard_array是一个助手模板,它返回一个布尔值,以确定该类型是否为std::array

代码语言:javascript
复制
namespace detail
{
    template<class T>
    struct is_standard_array : std::false_type { };

    template<class T, std::size_t N>
    struct is_standard_array<std::array<T, N>> : std::true_type { };
}

问题是,Args....参数包没有为函数调用impl()提供,因此编译器将其排除为候选重载。您还可以为类C提供专门的std::array,并适当地修改get()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24786077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档