3

假设我有一个 C++ 类模板:

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

private:
    _T internal;
};

我想要一种方法来为这个模板指定一个布尔值,当它为真时,将使这个模板中的每个成员都公开。

例如:

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

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

对于那些想知道的人,我正在使用 gtest 和 gmock 来模拟具体的类。所以,在我的一个单元测试中,我会有类似的东西:

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

对于这个测试模板,我的代码必须可以访问 internal。在生产中,我想对用户隐藏它。

我正在使用 msvc 11 (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 回答