代码之家  ›  专栏  ›  技术社区  ›  moswald Jarod42

确定编译时模板化函数结果的类型?

  •  1
  • moswald Jarod42  · 技术社区  · 15 年前

    我不确定这是可能的,但是有没有一种方法,利用模板编程的魔力,来定义一个函数,它有不同的返回值取决于它需要什么输入?

    潜在的:

    template<typename resultType>
    resultType GetResult(const std::string &key); // where the value of key may change resultType
    
    template<typename keyType, typename resultType>
    resultType GetResult(keyType key);
    

    现在,我知道上面的不正确。要使用第一个,你必须知道 resultType 在调用函数之前。然而,我已经了解到,很多“不可能”的事情往往只需要另一层(或两层)的间接性就可以实现。我就是找不到合适的方法。

    不过,第二个选择让我头脑发痒。我觉得我应该能够定义一些将字符串映射到类型(或其他类型)的其他助手对象,然后调用它的编译时结果。 GetResult 使用适当的模板参数。

    编辑:假设用于 结果类型 是无关的。没有可以测试“真实”类型的接口(可能是 int 和A MyClass * )

    编辑2:现实中的用法是,我有一个第三方对象,其中包含一组小部件、小工具等。您可以通过字符串ID(前缀为类型,很方便)来请求这些小部件,但您必须解析字符串,以发现需要调用“CollectionInstance.GetWidget(ID)”。我的计划是编写一个瘦包装器对象,它将智能地知道如何获取这些内部对象。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Staffan    15 年前

    不可以。不能使编译时定义的返回类型依赖于运行时值。

    不过,您可以返回boost::variant或boost::any。

        2
  •  2
  •   Edward Strange    15 年前

    您需要一个助手元函数来映射第二个示例中的这些类型。 typename helper<keyType>::type 然后将是您的返回类型,并且将删除keytype模板参数。您的助手元函数需要创建一个 type typedef取决于其模板参数。您可能会发现boost::mpl::为此任务映射一个有用的实用程序,并且可能会根据std::string定义不同的类型。

        3
  •  0
  •   Edward Strange    15 年前

    根据你的编辑,你想要的不是你想要的。你需要的是:

    1)存储X、Y、Z不相关类型中任何类型的变量的方法。 2)一种分析字符串的方法,找出要调用哪个函数以获取变量。

    第一个问题可以用boost::variant解决。

    第二个问题可以用两部分的解来解决。首先是解析例程,它返回一个函数或对象,该函数或对象将实际进行适当的调用。第二个是进行此调用并分配给变量的一组对象或函数。所以你最终会得到这样的结果:

    boost::variant<X,Y,Z> get_result(std::string stuff)
    {
        return parser::instance().get_call(stuff).make_call(stuff);
    }
    

    如果您实际上需要将类型信息与字符串的其余部分分开,那么get-call将需要为您这样做,或者您需要另一个函数,将字符串分成两部分,然后提供给上述调用。

        4
  •  0
  •   miked    15 年前

    你可以和演员接线员一起破解。我并不认为这是一个好的编程实践,但它是可行的:

        template <typename keyType>
        class GetResult
        {
          keyType mkey;
    
          GetResult(keyType key) : mkey(key) {}
    
          template <typename resultType>
          operator resultType()
          {
               //do stuff here that returns result type
          }
        }