我在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); }