将"扩展方法支持"添加到C++的不正确的指针赋值技巧将来会成为一个_问题吗?

Joa*_*rri 0 c++ extension-methods pointers

我将使用"C++扩展方法"向JNI jobjects添加"C++扩展方法"以使NDK代码更具可读性的解决方案,如(统一函数调用语法):

  • 子类我想要添加扩展方法的类.
  • 对于调用"扩展方法",使ExtensionsClass类型的指针指向OriginalClass - (尽管指向的对象不是ExtensionsClass).

重载很少,我们可以访问Original类的公共方法.

#include <iostream>

// Represents a class external to my source
class Person {
public:
    Person(){
        privateage = 20;
    }
    int age() { return privateage; }
private:
    int privateage;
    short anotherField;
};

class PersonExtensions : private Person {
public:
    inline int size() { return 5 + age(); }
    //NoFieldsOnExtensionClass
};

int main() {

    Person person;

    PersonExtensions* pE = (PersonExtensions*) &person;
    std::cout << pE -> size() << std::endl;
    std::cout << (*pE).size() << std::endl;

    std::cout << sizeof(Person) << std::endl;
    std::cout << sizeof(PersonExtensions) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你认为这个不正确的指针赋值,因为"扩展方法"只访问扩展类和扩展类的公共成员不会有任何Field变量,将来可能代表一个问题吗?对象的大小是相同的.

非常感谢.

Yak*_*ont 6

这是未定义的行为.

是的,任何时候都可以打破.

考虑重载->*或其他东西.

或者只是使用免费功能.

如果你真的想要中缀表示法:

template<class T, class F>
struct extension_method_t {
  F f;
  friend auto operator->*( T& t, extension_method_t const& self ) {
    return [&t,&self](auto&&...args)->decltype(auto) {
      return self.f( t, decltype(args)(args)... );
    };
  }
};
template< class T, class F >
extension_method_t<T,F> extension_method( F f ) {
  return {std::move(f)};
}
Run Code Online (Sandbox Code Playgroud)

然后:

auto size = extension_method<Person>([](auto& person)->int{
  return 5+person.age();
});
Person p;
std::cout << (p->*size)() << "\n"; // prints p.age()+5
Run Code Online (Sandbox Code Playgroud)

这里我们没有扩展方法,但我们有一个扩展方法指针.