2011-12-15 34 views
-1

我有简单的类,如this(其行为像Boost :: overload,但具有命名函数(我用它来简化\缩小反射\内省目的))。它对输入参数有多个返回类型有问题(编译器错误3066)。我的代码:重载函数映射容器中的C++函数返回类型:自动扣除失败,编译器错误

#include <iostream> 
#include <string> 
#include <map> 
#include <vector> 

template < class T0, class T1 > 
class my_map { 
    typedef T0 type_0; 
    typedef T1 type_1; 
    std::map < std::string, type_0 * >T0_var; 
    std::map < std::string, type_1 * >T1_var; 
    friend class apitemp; 
public: 
    my_map(int meaningless0 = 42, int meaningless1 = 42) {} 
    class apitemp { 
     std::string n_; 
     my_map *p; 
    public: 
     apitemp(std::string name_, my_map * parent):n_(name_), p(parent) {} 
     operator type_0 *() { 
      return p->T0_var[n_]; 
     } 
     operator type_1 *() { 
      return p->T1_var[n_]; 
     } 
    }; 
    void insert(std::string name, type_0 * ptr) { 
     T0_var[name] = ptr; 
    } 
    void insert(std::string name, type_1 * ptr) { 
     T1_var[name] = ptr; 
    } 
    apitemp operator[] (std::string n_) { 
     return apitemp(n_, this); 
    } 
}; 

template<class out, class in1, class in2> 
    out hello_world(in1 name, in2 number) 
{ 
    name += "!"; 
    std::cout << "Hello, " << name << std::endl; 
    return number; 
} 

template<class in1, class in2> 
std::string hello_world(in1 name, in2 number) 
{ 
    name += "!"; 
    std::cout << "Hello, " << name << std::endl; 
    return std::string("Yep, we can!"); 
} 

int main() { 
    int a = hello_world<int, std::string, const int &>("Tim", 25); 
    std::string b = hello_world<std::string, const int &>("Tim", 25); 

    my_map<int(std::string, const int &), std::string(std::string, const int &)> myMap; 
    myMap.insert("my_method_hello", &hello_world<int, std::string, const int &>); 
    myMap.insert("my_method_hello2", &hello_world<std::string, const int &>); 
    //int a = myMap["my_method_hello"]("Tim", 25); // error C3066: there are multiple ways that an object of this type can be called with these arguments 
    //std::string b = myMap["my_method_hello2"]("Tim", 25); // // error C3066: there are multiple ways that an object of this type can be called with these arguments 

    std::cin.get(); 
} 

如何向其API引入多重返回类型函数? API用户方式有可能无法使用吗?或者至少用一些API用户干扰如

int a = myMap["my_method_hello"]("Tim", 25)::int; 
std::string b = myMap["my_method_hello2"]("Tim", 25)::string; 

+2

“是否有可能用于API用户方式?” - 是谷歌翻译? – sehe 2011-12-15 08:02:31

回答

3

执行此操作的一种方法是让myMap["my_method_hello"]("Tim", 25)返回一个代理对象,该对象为您希望它返回的每种类型定义operator int()operator std::string()等。另一种方法是让代理对象为每种类型定义明确的.asInt().asString()方法。

如果目标类型在源代码中不明确(例如,如果将结果传递给函数),则重载运算符技术可能会引起混淆。同样,代理类型可能会混淆传递给它的模板函数,并且如果候选集合包含同时采用intstd::string(或代理自动转换为的其他类型)的函数,将无法轻松选择重载函数。因此,我建议提供.asInt()等功能,除此之外没有任何运营商。

您也可以拼出.asInt()等功能,如template<typename T> as()和使用明确的分工来定义新的转换。唯一的缺点这是源代码难以阅读

相关问题