История изменений
Исправление xperious, (текущая версия) :
А параметризовать шаблоном функции?
да вроде не шибко сложно
#include <iostream>
#include <functional>
#include <string>
template<typename T>
struct Result {};
template<class T>
Result<std::string> tojson(const T&) {
std::cout << "call tojson" << std::endl;
return Result<std::string>{};
}
template<class T>
Result<std::string> toxml(const T&) {
std::cout << "call tojxml" << std::endl;
return Result<std::string>{};
}
template<typename R, typename...Arg>
class Foo
{
public:
Foo(const std::function<R(Arg...)>& f_)
: f(f_)
{
}
R invoke(Arg...args) { return f(args...); }
private:
std::function<R(Arg...)> f;
};
int main()
{
const auto& f1 = toxml<int>;
Foo<Result<std::string>, int> obj1 { f1 };
obj1.invoke(1);
const auto& f2 = tojson<int>;
Foo<Result<std::string>, int> obj2 { f2 };
obj2.invoke(1);
}
Исходная версия xperious, :
А параметризовать шаблоном функции?
да вроде шибко сложно
#include <iostream>
#include <functional>
#include <string>
template<typename T>
struct Result {};
template<class T>
Result<std::string> tojson(const T&) {
std::cout << "call tojson" << std::endl;
return Result<std::string>{};
}
template<class T>
Result<std::string> toxml(const T&) {
std::cout << "call tojxml" << std::endl;
return Result<std::string>{};
}
template<typename R, typename...Arg>
class Foo
{
public:
Foo(const std::function<R(Arg...)>& f_)
: f(f_)
{
}
R invoke(Arg...args) { return f(args...); }
private:
std::function<R(Arg...)> f;
};
int main()
{
const auto& f1 = toxml<int>;
Foo<Result<std::string>, int> obj1 { f1 };
obj1.invoke(1);
const auto& f2 = tojson<int>;
Foo<Result<std::string>, int> obj2 { f2 };
obj2.invoke(1);
}