【发布时间】:2012-09-11 14:13:57
【问题描述】:
假设我有一个 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 功能和元编程结构。
【问题讨论】:
-
_T绝对不是一个好名字。它是为实现而保留的,尤其是这个,因为我知道它被用作宏来根据您的程序是否使用宽字符来加宽字符串。 -
好提示@chris。我以这个为例,而且我的模板几乎更具体,但很高兴知道这一点。