根据继承的class模板自动生成成员函数
Automatic generate member functions depending on inherited class template
我正在考虑一种自动检查对象是否有效的方法。
我有几个与硬件相关的对象(如 class A),可以通过外部(物理)事件删除它们。
为了检测这一点,我使用了 shared/weak 指针。但是现在我正在努力检查弱指针。由于这对于许多对象的每个成员函数都是以相同的方式完成的,因此我目前正在寻找一种方法来使用更少的冗余代码来完成此操作。
此外,我正在编写一个库,不希望用户处理这个(只是 return 指向用户自己处理它的弱指针因此没有选择)
我的最佳猜测如下所示。我的问题是,我找不到在模板中自动生成成员函数(func1 等)的方法。自己做会导致每个要验证的成员函数都有很多冗余代码(而且有很多)
A(以及更多其他对象)的每个成员函数都应由执行如下所示验证的函数包装。这对所有成员函数都是相同的,并且对许多 classes 完成,它们可以用作验证器的类型。
有谁知道如何解决这个问题?也许还有其他(更好的)方法可以解决这个问题。
非常感谢您的帮助。
一些限制:
只有 C++11 可能,
没有例外
class A {
public:
void func1() {}
//many more functions
};
template<typename T>
class Validator
{
//has to be done for all functions of A
void func1()
{
if (!wptr.expired())
{
wptr.lock()->func1();
}
else
errorHandling();
}
private:
std::weak_ptr<T> wptr;
void errorHandling() {}
};
如果调用者可以忍受笨拙的语法,您可以使用成员函数指针:
#include <memory>
#include <iostream>
class A {
public:
void func1() {
std::cout << "hello func1\n";
}
};
template<typename T>
class Validator
{
public:
Validator(std::shared_ptr<T> p) : wptr(p) {}
template <typename MemFun>
void call(MemFun mf) {
if (!wptr.expired())
{
(wptr.lock().get()->*mf)();
}
else
errorHandling();
}
private:
std::weak_ptr<T> wptr;
void errorHandling() {}
};
int main() {
auto x = std::make_shared<A>();
Validator<A> v{x};
v.call(&A::func1);
}
我会保护完整的用户函数调用:
class A {
public:
void func1() {}
//many more functions
};
template <typename T>
class Validator
{
public:
#if 1 // template way, but no-expressive signature
template <typename F>
void do_job(F f)
#else // type-erasure way, expressive, but with some overhead
void do_job(std::function<void (T&)> f)
#endif
{
auto t = wptr.lock();
if (t) {
f(*t);
} else {
errorHandling();
}
}
private:
void errorHandling();
private:
std::weak_ptr<T> wptr;
};
所以用户可能会链式调用:
Validator<A> val;
val.do_job([](A& a)
{
a.func1();
a.func2();
});
我正在考虑一种自动检查对象是否有效的方法。 我有几个与硬件相关的对象(如 class A),可以通过外部(物理)事件删除它们。
为了检测这一点,我使用了 shared/weak 指针。但是现在我正在努力检查弱指针。由于这对于许多对象的每个成员函数都是以相同的方式完成的,因此我目前正在寻找一种方法来使用更少的冗余代码来完成此操作。 此外,我正在编写一个库,不希望用户处理这个(只是 return 指向用户自己处理它的弱指针因此没有选择)
我的最佳猜测如下所示。我的问题是,我找不到在模板中自动生成成员函数(func1 等)的方法。自己做会导致每个要验证的成员函数都有很多冗余代码(而且有很多)
A(以及更多其他对象)的每个成员函数都应由执行如下所示验证的函数包装。这对所有成员函数都是相同的,并且对许多 classes 完成,它们可以用作验证器的类型。 有谁知道如何解决这个问题?也许还有其他(更好的)方法可以解决这个问题。 非常感谢您的帮助。
一些限制: 只有 C++11 可能, 没有例外
class A {
public:
void func1() {}
//many more functions
};
template<typename T>
class Validator
{
//has to be done for all functions of A
void func1()
{
if (!wptr.expired())
{
wptr.lock()->func1();
}
else
errorHandling();
}
private:
std::weak_ptr<T> wptr;
void errorHandling() {}
};
如果调用者可以忍受笨拙的语法,您可以使用成员函数指针:
#include <memory>
#include <iostream>
class A {
public:
void func1() {
std::cout << "hello func1\n";
}
};
template<typename T>
class Validator
{
public:
Validator(std::shared_ptr<T> p) : wptr(p) {}
template <typename MemFun>
void call(MemFun mf) {
if (!wptr.expired())
{
(wptr.lock().get()->*mf)();
}
else
errorHandling();
}
private:
std::weak_ptr<T> wptr;
void errorHandling() {}
};
int main() {
auto x = std::make_shared<A>();
Validator<A> v{x};
v.call(&A::func1);
}
我会保护完整的用户函数调用:
class A {
public:
void func1() {}
//many more functions
};
template <typename T>
class Validator
{
public:
#if 1 // template way, but no-expressive signature
template <typename F>
void do_job(F f)
#else // type-erasure way, expressive, but with some overhead
void do_job(std::function<void (T&)> f)
#endif
{
auto t = wptr.lock();
if (t) {
f(*t);
} else {
errorHandling();
}
}
private:
void errorHandling();
private:
std::weak_ptr<T> wptr;
};
所以用户可能会链式调用:
Validator<A> val;
val.do_job([](A& a)
{
a.func1();
a.func2();
});