c++ - 如何从作为模板参数传递的类中获取静态模板方法的地址

标签 c++ templates metaprogramming

我试图从作为模板参数传递给另一个类的类中获取静态方法的地址。下面是一个简化的示例:

#include <iostream>
#include <array>

using namespace std;

typedef size_t Data;

class MyFunction
{
private:
    static const std::array<std::string, 3> values;

public:
    template<size_t N>
    static void Func(const Data& aData)
    {
        size_t index = (N > aData ? 2 : (N == aData ? 1 : 0) );
        cout << "Function::Func<"<< N << ">:\t" << N << values[index] << aData << endl;
    }

    typedef decltype(&Func<0>) type;    
};

const std::array<std::string, 3> MyFunction::values {"<", "=", ">"};

template<class Function, size_t N>
class FunctionManager
{
private:
    static const typename Function::type func_;

    static constexpr typename Function::type Create()
    {
        return &Function::Func<N>; //ERROR: Causes "overloaded function with no contextual information".
    }
public: 
    void operator()(const Data &aData) const
    {
        func_(aData);
    }
};

template<class Function, size_t N>
const typename Function::type FunctionManager<Function, N>::func_ = FunctionManager<Function, N>::Create();

int main()
{
    static const size_t N = 6;
    auto man = FunctionManager<MyFunction, N>();
    man(N/2);
    return 0;
}

您还可以找到代码here 。问题出在 Create() 函数中,我收到“没有上下文类型信息的重载函数的地址”错误。但是,如果我将 &Function::Func 更改为 &MyFunction::Func,它就可以正常工作。我想将实际函数作为模板参数而不是对其进行硬编码,有人知道如何解决这个问题吗?请注意,我意识到有更简单的方法可以完成我想做的事情,但实际代码而不是单个 Function::type 使用索引技巧等创建它们的数组。任何帮助将不胜感激。

最佳答案

这个错误消息确实让人有些头疼。以下是缺少的内容:

return &Function::template Func<N>;
//                ^^^^^^^^

Function 是一个模板参数,您需要帮助编译器并告诉它嵌套名称 Func 命名一个模板。

关于c++ - 如何从作为模板参数传递的类中获取静态模板方法的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596971/

相关文章:

c++ - 专门化模板成员函数 [SFINAE]

C++声明许多相似的类而不重复自己

c++ - gcc -finline-functions 行为?

c++ - 如何为这个自定义 C++ List 类实现删除函数?

c# - 如何从字节中获取子位作为单独的整数值?

c++ - 具有 STL 容器成员的模板类

python - pytest - 向所有或标记的测试函数添加断言

ruby - 如何调用名称以给定字符串开头的类的所有实例方法?

c++ - 在 Visual Studio 2015 中将其他内容与右括号保持在同一行?

c++ - 在 Visual Studio 2010 SP1 上调用 serial_port::cancel 会导致运行时检查失败 #0