假设我有一个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来模拟具体的类。所以,在我的一个单元测试中,我会有类似的东西:
TEST(MyClass, Test1) {
MyClass<SomeMockClass, true> c1;
EXPECT_CALL(c1.internal, someFunc()).Times(1);
}
对于此测试模板,我的代码必须可以访问内部。在制作中,我想将其隐藏起来。
我正在使用msvc 11(Visual Studio 2012),因此我可以访问一些C ++ 11功能和元编程构造。
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}