SomeFunction
andSetArg
を のより一般的なものに置き換えたいと思いboost
ます。bind
と組み合わせて何かできそうですがlambda
、方法がわかりません。
このコードは非常に単純ですが、これを置き換えたい理由は、 for2
と3
etc の引数が必要だからです。
template<class T>
struct SomeFunction
{
T value;
SomeFunction(T s)
: value(s) {}
void operator()(T& s)
{
s = value;
}
};
template<class T>
SomeFunction<T> SetArg(T value)
{
return SomeFunction<T>(value);
}
要求事項:
- 関数オブジェクトを返す関数が必要です。
- この関数オブジェクトを呼び出すと、パラメーターは参照によって渡されます。
- この関数は、事前に設定された値に設定することにより、参照によって渡されたオブジェクトを変更します。
- 上記のコードでは、事前設定された値が で値によって渡されます
ctor
が、他の方法でも問題ありません。
次のコードは、使用方法を示しています。
void main()
{
std::string t;
SetArg(std::string("hello"))(t);
assert(t == "hello");
}
いくつかのコンテキスト:
クラス のクライアント コードをテストしたいFoo
。func1
そのため、 の実装を自分のものに置き換えたいと思いますが、柔軟な方法で行います。
struct Foo
{
virtual void func1(std::string& s)
{
}
};
struct MockFoo : public Foo {
MOCK_METHOD1(func1, void(std::string&));
};
void ExampleTestCase::example()
{
MockFoo f;
std::string s;
EXPECT_CALL(f, func1(_))
.WillOnce(Invoke(SetArg(std::string("hello"))));
f.func1(s);
CPPUNIT_ASSERT_EQUAL(std::string("hello"), s);
}
Invoke は、関数または関数オブジェクトを取ります。itの新しい実装内でfunc1
は、 によって返された関数オブジェクトが呼び出されSetArg
、その引数が string に設定されます"hello"
。
Invoke は gmock/gtest の一部ですが、そうでSetArg
はありません。