无法转换参数 - 模板错误

Cannot convert argument - Template Error

本文关键字:错误 参数 转换      更新时间:2023-10-16

我尝试使用模板实现访问者模式。

我的代码是:

struct some_class
{
    char field1;
    bool field2;
    some_class()
        : field1('a')
        , field2(0)
    {
    }
};
struct unnamed_lambda
{
    template<typename T>
    T operator()(T x) const { return x + 1; }
};
struct unnamed_lambda2
{
    template<typename T>
    T operator()(T x) const { return x + 2; }
};

template<class processor>
void reflect(processor & p, some_class& sc)
{
    reflect(p, sc.field1, "field1");
    reflect(p, sc.field2, "field2");
}
template<class t>
void reflect(unnamed_lambda & p, t& val, string str)
{
    cout << val << endl;
}
void print_helper()
{
    unnamed_lambda lambda = unnamed_lambda{};
    some_class sc;
    reflect(lambda, sc);
}
template<class t>
void reflect2(unnamed_lambda2 & p, t& val, string str)
{
    cout << val + 1 << endl;
}
void print_helper2()
{
    unnamed_lambda2 lambda = unnamed_lambda2{};
    some_class sc;
    reflect(lambda, sc);
}
int main() 
{
    print_helper();
    print_helper2();
    return 0;
}

我想要一些定义其字段遍历顺序的类。就我而言,这是一个void reflect(processor & p, some_class& sc)函数。此外,我想对这个类有一组操作。就我而言,这是print_helperprint_helper2.

为了关联操作和所需的操作,我创建了两个哑结构:unnamed_lambdaunnamed_lambda2。这些结构什么都不做。这是一种解决方法。

为什么这段代码闻起来这么难闻?这是有原因的。签名功能void reflect(processor & p, some_class& sc)是固定的。

换句话说,除了更改此函数的签名及其实现之外,我可以做所有事情。更我不能改变some_class类。

我一头雾水。我会很高兴对我的问题有任何帮助。

跳过中间步骤。您的访客应该只访问:

template<class processor>
void reflect(processor & p, some_class& sc)
{
    p(sc.field1, "field1");
    p(sc.field2, "field2");
}

访客可能是:

struct visitor {
    template <typename T>
    void operator()(T& field, const std::string& name) {
        std::cout << "value of '" << name << "' = " << field << 'n'; 
    }
};
some_class sc;
visitor v;
reflect(v, sc);