3

C++クラステンプレートがあるとしましょう。

template <class _T>
class MyClass
{
public:
    int func();

private:
    _T internal;
};

このテンプレートにブール値を指定して、trueの場合、このテンプレートのすべてのメンバーを公開する方法が必要です。

例えば:

MyClass<SomeClass, false> c1;
c1.internal.someFunc(); // ERROR

MyClass<SomeOtherClass, true> c2;
c2.internal.someFunc(); // SUCCESS

不思議に思う人のために、私はgtestとgmockを使用して具体的なクラスをモックアップしています。したがって、ユニットテストの1つで、次のようになります。

TEST(MyClass, Test1) {
    MyClass<SomeMockClass, true> c1;
    EXPECT_CALL(c1.internal, someFunc()).Times(1);
}

このテストテンプレートでは、コードから内部にアクセスできる必要があります。本番環境では、それをユーザーから隠したいと思います。

私はmsvc11(Visual Studio 2012)を使用しているので、いくつかのC++11機能とメタプログラミング構造にアクセスできます。

4

2 に答える 2

4

メインクラスからテストヘルパーを継承し、友達を宣言するヘルパーを継承して、関心のある要素を公開することができます。

#include <iostream>

template<typename T> class TestMyClass;

template<typename T>
class MyClass
{
    friend class TestMyClass<T>;
    public:
        int func();
    private:
        T internal;
};

template <class T>
class TestMyClass : public MyClass<T>
{
    public:
        using MyClass<T>::internal;
};

int main()
{
    TestMyClass<double> s;
    s.internal = 5;
    std::cout << s.internal << "\n";
    return 0;
}
于 2012-09-11T06:13:57.903 に答える
1

これはクラステンプレートの特殊化で行うことができますが、変更を加えるときに両方のコードセットを変更する必要があることを意味します。

#include <iostream>

template <class T, bool visible>
class MyClass
{
};

template <class T>
class MyClass<T, true>
{
public:
    int func();
    T internal;
};

template <class T>
class MyClass<T, false>
{
public:
    int func();
private:
    T internal;
};

int main()
{
    MyClass<int, true> s;
    s.internal = 5;
    std::cout << s.internal << "\n";
    return 0;
}
于 2012-09-11T02:40:52.613 に答える