【问题标题】:Store template class function pointers in map在地图中存储模板类函数指针
【发布时间】:2018-08-08 08:24:05
【问题描述】:

模板类

template <class F>
class MyClass
{
public:

inline static bool isPresent()
{
    if (F::getDetails())
    {
        return F::isPresent();
    }

    return false;
};
};

基类

class Base
{
public:

inline static bool isPresent()
{
    ...
}

static bool getDetails();
};

派生类

class Derived : public Base
{
public:

};

模板类函数调用

const bool isEnabled = MyClass<Derived>::isPresent();

我想将上述函数调用作为指针存储在 map 中。但是,模板参数可以是不同的派生类。我该怎么做?

using MyClassPtr = bool (MyClass<Base>::*)();
map<string,MyClassPtr>  data;
data = {  
    {"abc", &MyClass<Derived>::isPresent},
    {"wer", &MyClass<Derived1>::isPresent}
};  

我收到以下错误:

error: no match for ‘operator=’ (operand types are ‘std::map<std::basic_string<char>, bool (App::MyClass<App::Derived>::*)()>’ and ‘<brace-enclosed initializer list>’)
 data = {

【问题讨论】:

  • isEnabled 根本不是一个函数。你到底想要什么?请给minimal reproducible example
  • @appleapple 这只是MyClass中的一些方法
  • @TheQuantumPhysicist 我相信我看到了有问题的const bool isEnabled。其他地方都没有。
  • 我删除了我的答案,因为有人在没有解释原因的情况下投了反对票。如果这里的人不在乎,那么我也是。现在我记得为什么我不那么活跃了。问候。
  • 静态方法多为regular函数,所以bool (*isEnabledFunc)() = &amp;MyClass&lt;Derived&gt;::isPresent;.

标签: c++ c++11 templates function-pointers


【解决方案1】:

由于您的成员函数是静态的,因此您必须将函数指针定义为普通指针类型:

using MyClassPtr = bool (*)();

简化的完整代码为我编译:

class Base
{
    public:
        static bool isEnabled() { return true;}
};

class Derived: public Base { };
class Derived1: public Base { };

template <class F>
class MyClass
{
    public:
        inline static bool isEnabled()
        {
            return F::isEnabled();
        }

        bool AnyMember() { return true; }
};

template <typename T>
using MyMemberPtr = bool (MyClass<T>::*)();
using MyClassPtr = bool (*)();



int main()
{
    std::map<string,MyClassPtr>  data;
    data = {
        {"abc", &MyClass<Derived>::isEnabled},
        {"wer", &MyClass<Derived1>::isEnabled}
    };

    std::map<string, MyMemberPtr<Derived>> dataMember;

    dataMember = {
        {"xyz", &MyClass<Derived>::AnyMember}
    };

    std::map< string, std::function< bool() > > anyFuncs;

    anyFuncs =
    {
        { "one", [](){ return MyClass<Derived>::isEnabled();} },  // going to static
        { "two", [](){ return MyClass<Derived>().AnyMember(); } }, // going to member for Derived
        { "three", [](){ return MyClass<Derived1>().AnyMember(); } } // going to member for Derived1
    };
}

我认为IsPresentIsEnabled 是错字。

编辑:更新了成员指针。

这里的问题是不可能有一个指向“任何”类类型的指针,所以你必须将它定义为一个模板,并为每个派生类使用一个单独的模板。

如果您需要存储所有指向单个数据结构的指针,您可以使用std::function 和 lambda 来解决该问题。

【讨论】:

  • 谢谢。您能否还提到如何为非静态函数执行此操作?
  • 如果您可以使用std::function 说明解决方案,那么答案将是完整的,对许多人都有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多