Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从作为模板参数传递的类中获取静态模板方法的地址_C++_Templates_Metaprogramming - Fatal编程技术网

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

C++ 如何从作为模板参数传递的类中获取静态模板方法的地址,c++,templates,metaprogramming,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<siz

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

#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;
}
#包括

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

错误消息确实会引起一些头痛。以下是缺少的内容:

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

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

错误消息确实会引起一些挠头。以下是缺少的内容:

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

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

&Function::template Func
-编译器不知道那里有一个模板,默认情况下需要一个值。可能的重复有点像XY问题,您能否详细说明
Create()
函数的用途,以及为什么不想“硬编码”具体函数的引用?您希望客户端如何使用此接口?任意选择静态方法来通过一个?谢谢Xeo和jrok!这就解决了问题。非常感谢。
&Function::template Func
-编译器不知道您有一个模板,默认情况下需要一个值。可能的重复闻起来有点像XY问题,您能否详细说明
Create()
函数的用途,以及为什么不想“硬编码”具体函数的引用?您希望客户端如何使用此接口?任意选择静态方法来通过一个?谢谢Xeo和jrok!这就解决了问题。非常感谢。