#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
类中?
我认为你不能,因为为了命名嵌套类型,你必须实例化嵌套类型,但你不能这样做,因为它取决于嵌套类型。
您可以做的是将一种或两种类型移动到单独的命名空间中。通常,人们使用
namespace detail
来实现此目的,隐含的含义是外部用户不应该从 detail::
访问任何内容。