如何从旨在作为专业化的 Derived 访问基本模板参数?

问题描述 投票:0回答:1

因为模板化成员函数的部分特化在 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; 
}
c++ templates inheritance template-specialization partial-specialization
1个回答
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;
        }
};
© www.soinside.com 2019 - 2024. All rights reserved.