Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从派生类访问模板参数?_C++_Templates_Derived - Fatal编程技术网

C++ 如何从派生类访问模板参数?

C++ 如何从派生类访问模板参数?,c++,templates,derived,C++,Templates,Derived,我有一个 template <int N> class Base template参数具有模板的作用域,但您可以在模板中定义可由派生类使用的嵌套常量: template <int N> class Base { public: // or protected: static const int theN = N; }; 模板类基类{ 公共或受保护: 静态常数int=N; }; 另一个选项是,您可以为派生类设置模板: template <int N>

我有一个

template <int N> class Base

template参数具有模板的作用域,但您可以在模板中定义可由派生类使用的嵌套常量:

template <int N> class Base {
public: // or protected:
   static const int theN = N;
};
模板类基类{
公共或受保护:
静态常数int=N;
};

另一个选项是,您可以为派生类设置模板:

template <int N>
class Derived : public Base<N>
{
    void myMethod()
    {
        for (int i = 0; i < N; ++i)
        //
    }
};
模板
派生类:公共基
{
void myMethod()
{
对于(int i=0;i
这就是我在上面的评论中的意思:

class Base{
  public:
     Base(int value = 1) : value_(value){}  //don't need to use default param but can
  private:
     int value_
}

class Derived : public Base
{}
为什么模板化?你需要专门化整个班级吗?另一种方法是“虚拟化”非成员函数,这些函数根据设置为“专门化”的标准从模板中调用


编辑:

为什么不写1而不是N?你想做什么?似乎是个奇怪的问题,因为你知道N是1。对,我知道N==1。但是我会在
派生::myMethod()
中多次出现“1”,我想有一种更聪明的方法在开发过程中更改N的值,而不是手动将所有“1”更新为某个新值。+1用于创造力,但如果他需要这样做,我认为这更可能是一个设计问题……我猜这是一个设计问题。我猜他已经创建了一个模板化容器,并且正在使用它的继承(而不是组合),同时试图通过一些受保护的而不是公共接口访问容器。但我的水晶球可能掉了…我讨厌我的水晶球掉了(@David:+1谢谢,那会有用的。不过,这不是我所期望的-这通常不会至少为那个额外的常量分配一次内存吗(即使它是一个静态变量,除非它得到优化)?另外,从风格上讲,现在我可以重复访问这个值(通过N和N),这不是很简单。@David+Luchian:当然这可能是设计问题……但我试图实现的是:我有一个模板类,它在许多捕获设备上得到专门化,现在我想派生一个类,它实现N=1情况下的特殊操作。然而,这个派生类不仅仅是N=1的模板。是的,但是N!=1的派生模板将永远不会被使用……因此,派生模板的用户在每次实例化它时都要指定它,这对他们来说是一个不应有的负担(也会暴露实现细节)。我会这样做(如果我最终出于某种原因需要以这种方式使用模板参数。对我来说,N完全是模板化的似乎很奇怪。你真的需要为N的每一个值都有一个实例化吗(似乎这会导致严重的代码膨胀).@PhilippJS鉴于您对Jesse answer的评论,为什么模板需要1。这不是在构建时初始化的成员吗?请参阅下面的答案…@clanmjc:正如我在上面的评论中所解释的,Base代表一组N个捕获设备。对于
派生的
,我只有一个-但非常具体-需要的捕获设备我有一些代码从
Base::myMethod()
复制粘贴到
Derived::myMethod()
,但我想尽量减少结构更改以避免错误。关于“在构造时初始化的成员(我想是
Derived
)”-同样,我必须硬编码“Derived::myN(1)”在元素初始值设定项列表中,否?请参见我下面关于硬编码的回答。另外,N字面上是int,或者N是某个对象。不管你如何对它进行骰子运算,包括在你的示例中,某处都会有1个硬编码。然而,这并不意味着Dervied类需要知道任何关于这个细节的信息。
template <int N>
class Derived : public Base<N>
{
    void myMethod()
    {
        for (int i = 0; i < N; ++i)
        //
    }
};
class Base{
  public:
     Base(int value = 1) : value_(value){}  //don't need to use default param but can
  private:
     int value_
}

class Derived : public Base
{}