相关疑难解决方法(0)

使用继承的类模板避免公共成员不可见性和源代码膨胀/重复的更好方法是什么?

上下文:
受保护和公共类成员的继承是面向对象编程的基本概念.下面的简单示例说明了一个经常遇到的情况,其中类CDerived继承了类的所有公共成员,CBase并添加了自己的1个附加函数,而不更改或显式重新定义或重新定义类的任何公共成员CBase.

#include <stdio.h>

class CBase
{
public:
    char Arr[32];

    int Fn1(void) {
        return Arr[1] ^ Arr[sizeof(Arr)-1];
    }

    int Fn2(void) {
        return Arr[2] ^ Arr[sizeof(Arr)-2];
    }
};


class CDerived : public CBase
{
public:  
    int FnSum(void) {
        return Fn1() + Fn2();
    }
};

int main(void)
{
    CDerived ddd;

    printf("%d\n", ddd.Fn1());
    printf("%d\n", ddd.Fn2());
    printf("%d\n", ddd.FnSum());

    return (int)ddd.Arr[0];
};
Run Code Online (Sandbox Code Playgroud)

上面的代码在所有主要编译器上编译都没有问题.

但是,如果希望" 模板化 "此代码,例如:通过参数化Arr数组的大小,那么CBase类模板的所有公共成员对CDerived符合最新C++标准的编译器上的类模板都是不可见的.
以下是问题代码:

#include <stdio.h>

template …
Run Code Online (Sandbox Code Playgroud)

c++ templates

21
推荐指数
2
解决办法
795
查看次数

如何在保持我的实现者类私有的同时在C++中使用可变参数模板?

#include <cstdio>

class builtin_pack
{
    long v[4];
public:
    builtin_pack ( long v1, long v2, long v3, long v4 ) : v{v1, v2, v3, v4} {}
    void builtin_op()
    {
        printf ( "%lx,%lx,%lx,%lx\n", v[0], v[1], v[2], v[3] );
    };
    template<typename Func, typename... Targs>
    void builtin_apply ( Func f, Targs ... t )
    {
        for ( int i = 0; i < 4; i++ )
        {
            v[i] = f ( t.v[i]... );
        }
    }
};

class pack : builtin_pack
{
public:
    pack ( …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates c++11

7
推荐指数
1
解决办法
261
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

variadic-templates ×1