Skip to content

Instantly share code, notes, and snippets.

@adiog
Created October 24, 2017 08:21
Show Gist options
  • Save adiog/e60e0874ada1c59a48bf2574421b7432 to your computer and use it in GitHub Desktop.
Save adiog/e60e0874ada1c59a48bf2574421b7432 to your computer and use it in GitHub Desktop.
cpp's pipe operator
#include <gtest/gtest.h>
template<typename T>
struct Wrapper {
explicit Wrapper(T value) : value(value) {};
operator T() {return value;}
T value;
};
template<typename T>
Wrapper<T> FORWARD(T x)
{
return Wrapper<T>(x);
}
template<typename T>
T operator>>(Wrapper<T> arg, T(*foo)(T))
{
return foo(arg.value);
}
template<typename T>
Wrapper<T> operator>>(Wrapper<T> arg, Wrapper<T(*)(T)> foo)
{
return Wrapper<T>((*foo.value)(arg.value));
}
int add(int x)
{
return x + 4;
}
int multiply(int x)
{
return x * 7;
}
TEST(ChainCallTestSuite, ChainCallTestCase) {
int ret = FORWARD(add(2)) >> FORWARD(multiply);
ASSERT_EQ(ret, 42);
int ret_3 = FORWARD(add(2)) >> FORWARD(multiply) >> FORWARD(add);
ASSERT_EQ(ret_3, 46);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment