LINUX.ORG.RU

История изменений

Исправление 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);    
}