gpt4 book ai didi

c++ - 我可以定义从 std::function 到 std::shared_ptr 的隐式转换吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:47 24 4
gpt4 key购买 nike

我有一个类用作从列表中选择值的谓词。

class Predicate {
public:
// In this example, I am using QString as value type
// this is not what happens in actual code, where more complex data is being validated
virtual bool evaluate(const QString& val) const = 0;
};

最初,我使用了 lambda 函数,但这会产生大量重复的垃圾代码。因此,我想使用继承的谓词类。例如:

class PredicateMaxLength: public RowPredicate {
public:
PredicateMaxLength(const int max) : maxLength(max) {}
virtual bool evaluate(const QString& val) const {return val.length()<maxLength;}
protected:
const int maxLength;
};

为了让继承成为现实,给出的是指针而不是值:

class SomeDataObject {
// Removes all values that satisfy the given predicate
int removeValues(const std::shared_ptr<Predicate> pred);
}

现在我们肯定会在代码不会重复的情况下(例如某些特殊情况)使用 lambda。为此,PredicateLambda已创建:

typedef std::function<bool(const QString& val)> StdPredicateLambda;
class PredicateLambda: public Predicate {
public:
PredicateLambda(const StdPredicateLambda& lambda) : RowPredicate(), callback_(lambda) {}
virtual bool evaluate(const QString& val) const override {return callback_(val);}
protected:
const StdPredicateLambda callback_;
};

这样做的恶劣影响是,无论何时使用 lambda,都必须将其包装到 PredicateLambda 中。构造函数:

myObject.deleteItems(std::make_shared<PredicateLambda>([]->bool{ ... lambda code ... }));

这很丑。我有两个选择:

  • 对于每个接受谓词的函数,都有一个重载来进行上面看到的转换。这复制了头文件中的方法数
  • std::function<bool(const QString& val)> 进行隐式转换至 std::shared_ptr<Predicate>这将执行此操作:

    std::shared_ptr<Predicate> magicImplicitConversion(const StdPredicateLambda& lambdaFn) {
    return std::make_shared<PredicateLambda>(lambdaFn);
    }

我是来问第二个方案可不可以的。如果是,它会带来任何风险吗?

最佳答案

如果你不想使用template不暴露代码,你可以使用std::function:

class SomeDataObject {
// Removes all values that satisfy the given predicate
int removeValues(std::function<bool(const QString&)> pred);
};

和你的谓词

class PredicateMaxLength {
public:
explicit PredicateMaxLength(int max) : maxLength(max) {}
bool operator ()(const QString& val) const {return val.length()<maxLength;}
protected:
int maxLength;
};

所以你可以使用任何一个

SomeDataObject someDataObject;

someDataObject.removeValues(PredicateMaxLength(42));
someDataObject.removeValues([](const QString& s) { return s.size() < 42; });

关于c++ - 我可以定义从 std::function 到 std::shared_ptr<MyClass> 的隐式转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com