因为模板化成员函数的部分特化在 C++ 中是不可能的,所以我现在尝试通过类模板继承来规避这个问题。 在这种方法中,我从基类派生,仅指定我想要专门化的模板参数,将其余部分保留为派生类中的模板参数:
template <typename X, typename Y, typename Z>
class Base{};
template <typename Z> : public Base<int, int, Z>
class Derived{};
我想知道是否可以从派生类内部访问继承关系中的指定参数? 我可以想象,您将这些参数存储为
static constexpr
中的 Base
,从而使它们在 Derived
中可用。
但是,是否还有另一种方法,无需自己将它们显式存储为 static constexpr
属性?
这是我希望改进的一个例子:
#include <cstdint>
#include <iostream>
template<std::size_t Dimension, std::size_t Size, typename Real>
class BaseDistribution
{
public:
static constexpr std::size_t dim_ = Dimension;
static constexpr std::size_t size_ = Size;
};
template<typename Real>
class DerivedDistribution : public BaseDistribution<2, 9, Real>
{
public:
void print_dimension()
{
std::cout << "Dimension: " << this->dim_ << std::endl;
}
void print_size()
{
std::cout << "Size: " << this->size_ << std::endl;
}
};
int main()
{
DerivedDistribution foo = DerivedDistribution<double>();
foo.print_dimension();
foo.print_size();
return 0;
}
是的,您可以编写模板函数来获取它们。但是,如果您控制
BaseDistribution
,那么拥有(静态)成员就会简单得多。
template <std::size_t Dimension, std::size_t Size, typename Real>
class BaseDistribution {};
template <std::size_t Dimension, std::size_t Size, typename Real>
constexpr std::size_t BaseDistributionDimension(const BaseDistribution<Dimension, Size, Real> *) { return Dimension; }
template <std::size_t Dimension, std::size_t Size, typename Real>
constexpr std::size_t BaseDistributionSize(const BaseDistribution<Dimension, Size, Real> *) { return Size; }
template<typename Real>
class DerivedDistribution : public BaseDistribution<2, 9, Real>
{
public:
void print_dimension()
{
std::cout << "Dimension: " << BaseDistributionDimension(this) << std::endl;
}
void print_size()
{
std::cout << "Size: " << BaseDistributionSize(this) << std::endl;
}
};