2017-03-09 179 views
0

我想使用模板来创建一个用于理解概念的映射,但是我收到一个错误,并且无法理解我在做什么错误。使用地图模板函数指针

任何人都可以看看,让我知道我做错了什么?如果可能的话,请分享一个设计的实例,我真的很感激。

感谢

#include <iostream> 
#include <map> 

using namespace std; 

enum MathOperations 
{ 
    ADD = 0, 
    SUBTRACT, 
    MULTIPLY, 
    DIVISION 
}; 

template <typename T> 
T Addition(T a, T b) 
{ 
    return a + b; 
} 

template <typename T> 
T Subtraction(T a, T b) 
{ 
    return a - b; 
} 

template <typename T> 
struct MathOp 
{ 
    typedef T (*FuncPtr) (T, T); 
}; 

/* I am getting a warning here, which says variable templates are c++1 extension */ 
template <typename T> 
const std::map<MathOperations, typename MathOp<T>::FuncPtr> MathMap = { 
    { MathOperations::ADD, &Addition<T> }, 
    { MathOperations::SUBTRACT, &Subtraction<T> } 
}; 

int main() 
{ 
    MathOp<int> mathIntObj; 

    /* I am getting error here */ 
    /* No viable overloaded operator[] for type 'const std::map<MathOperations, typename MathOp<int>::FuncPtr>' */ 
    std::cout << *(MathMap<int>[MathOperations::ADD])(1, 2) << endl; 

    return 0; 
} 

编辑: 感谢@Piotr Skotnicki,谁分享了我的错误的解决方案。 我不得不做出如下改变:

std::cout << (*MathMap<int>.at(MathOperations::ADD))(1, 2) << endl; 

删除

MathOp<int> mathIntObj; 

不过,我需要修复的警告。有任何想法吗 ?由于

+0

能否请您复制/粘贴错误消息?这将是有益的。 – Quentin

+0

map :: operator []' –

+0

没有const超载这里是错误:没有可行的重载操作符[]为类型'const std :: map :: FuncPtr>'sc - 201702190978谢谢 –

回答

0

为什么不使用lambda表达式和类模板std::function,从而大大降低了您的代码大小:

#include <iostream> 
#include <map> 
#include <functional> 

using namespace std; 

enum MathOperations 
{ 
    ADD = 0, 
    SUBSTRACT, 
    MULTIPLY, 
    DIVISION 
}; 

template <typename T> 
const std::map<MathOperations, typename std::function<T(T,T)>> MathMap = { 
    { MathOperations::ADD, [](T a, T b){ return a + b; } }, 
    { MathOperations::SUBSTRACT, [](T a, T b) { return a - b; } } 
}; 

int main() 
{ 

    std::cout << (MathMap<int>.at(MathOperations::ADD))(3, 2) << endl; 
    std::cout << (MathMap<int>.at(MathOperations::SUBSTRACT))(6, 5) << endl; 

    return 0; 
} 
+0

感谢您分享您的反馈意见和示例。其实,我想按顺序播放函数指针了解他们,所以我开始了这个想法,我可以知道你在你的例子中使用了lambda表达式吗?我只看到std :: function,并且你能告诉我如何解决我在map中得到的警告吗?谢谢 –

+0

我使用拉姆达s在地图的初始化中。在您的代码中:将'std :: cout << *(MathMap [MathOperations :: ADD])(1,2)<< endl;'更改为'std :: cout <<(MathMap .at(MathOperations :: ADD))(1,2)<< endl;'如Jarod42建议并踢'MathOp mathIntObj;' – FloHe

+0

了解。尽管如此,我仍然用Map表达式提到了这个警告。任何想法解决这个问题?谢谢 –