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!这就解决了问题。非常感谢。