为返回使用可变模板的函数指针的函数获取正确的类型信息



我在Foo 类中定义了一个可变函数

AddCodeChunkInner(Type, DerivativeStatus, bInlined, Format, args...);

我正在尝试编写一个函数,返回其函数指针

static auto getAddCodeChunkInner(){return &Foo::AddCodeChunkInner;}

然而,我得到了一个错误,说它";无法从"重载函数"推导"auto"的类型。

我认为解决方案应该是这样的:

template <typename... Args>
static auto getAddCodeChunkInner(Args...) -> decltype(int32 (Foo::*) (EMaterialValueType Type, EDerivativeStatus DerivativeStatus, bool bInlined, const TCHAR* Format, ...))

不过,我在这里有点难以找到正确的语法。我有大致的想法,但我对模板的了解有点缺乏

最小可重现性示例:

class FHLSLMaterialTranslator : public FMaterialCompiler
{
int32 AddCodeChunkInner(uint64 Hash, const TCHAR* FormattedCode, EMaterialValueType Type, EDerivativeStatus DerivativeStatus, bool bInlined);
}
int32 FHLSLMaterialTranslator::AddCodeChunkInner(uint64 Hash, const TCHAR* FormattedCode, EMaterialValueType Type, EDerivativeStatus DerivativeStatus, bool bInlined)
{
return 1;
}
class myHLSLMaterialTranslator : public FHLSLMaterialTranslator
{
public:
static auto getAddCodeChunkInner(){return &FHLSLMaterialTranslator::AddCodeChunkInner;}
};

无论你的问题是什么,都与函数的变差或函数的返回类型无关。以下代码在gcc、clang和MSVC上编译时没有问题:

struct S
{
void f(int, ...) { }
};
static auto getF() { return &S::f; }

考虑到您所描述的错误消息,听起来问题可能是Foo中有多个名为AddCodeChunkInner的函数。如果是这样的话,您可以通过进行强制转换来明确指定您所说的重载,所需的重载将与之最匹配:

struct T
{
void g(int) { }
void g(int, ...) { }
};
static auto getG1() { return static_cast<void(T::*)(int)>(&T::g); }
static auto getG2() { return static_cast<void(T::*)(int, ...)>(&T::g); }

最新更新