公共类型模板的特化,而不需要特化类模板

问题描述 投票:0回答:1
#include "vector"

template <unsigned int order>
struct ReturnType;

template <>
struct ReturnType<0>
{
    using type = double; // Return type for value
};

template <>
struct ReturnType<1>
{
    using type = std::vector<double>; // Return type for deriv
};


template <unsigned int dim>
class Function
{
    void value(typename ReturnType<0>::type &value) {}; 
    void deriv(typename ReturnType<1>::type &deriv) {}; 
};


int main() {
    Function<1> interp;
    return 0;
}

我想编写一个

Function
类,成员函数的参数是
ReturnType<order>
结构的特化。这个想法是,当我实现多个派生类时,我只需在代码中的一处更改返回类型。不过,我更喜欢将
ReturnType<order>
结构体作为公共类型放置在
Function
类中以增强封装性。

概念上:

#include <vector>

template <unsigned int dim>
class Function
{
public:
    template <unsigned int order>
    struct ReturnType; 

    using ValueReturnType = typename ReturnType<0>::type;
    using DerivReturnType = typename ReturnType<1>::type;

    void value(ValueReturnType &value) {}; 
    void deriv(DerivReturnType &deriv) {}; 
};

template <>
template <>
struct Function<1>::ReturnType<0>
{
    using type = double;
};

template <>
template <>
struct Function<1>::ReturnType<1>
{
    using type = std::vector<double>;
};

int main() {
    return 0;
}

此解决方案需要完整的模板专业化,因为不允许没有类模板的专业化(如果我错了,请纠正我)。

有没有一种解决方案没有完整的模板专业化并将

ReturnType
结构保留在
Function
类中?

c++ class c++17 template-specialization
1个回答
0
投票

我认为你不能,因为为了命名嵌套类型,你必须实例化嵌套类型,但你不能这样做,因为它取决于嵌套类型。

您可以做的是将一种或两种类型移动到单独的命名空间中。通常,人们使用

namespace detail
来实现此目的,隐含的含义是外部用户不应该从
detail::
访问任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.