У меня есть вариационная функция, определенная в классе Foo
AddCodeChunkInner(Type, DerivativeStatus, bInlined, Format, args...);
И я пытаюсь написать функцию, которая возвращает указатель на функцию.
static auto getAddCodeChunkInner(){return &Foo::AddCodeChunkInner;}
Однако я получаю сообщение об ошибке, в котором говорится, что он «не может вывести тип для« авто »из« перегруженной функции ».
Я считаю, что решение должно выглядеть примерно так:
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;}
};
Вариационная функция и вариативный шаблон — это разные вещи. Непонятно, что вы имеете в виду. В сообщении об ошибке также говорится, что существует несколько перегрузок, о которых вы не упомянули. Вы не можете сделать указатель функции из шаблона функции, только из одной из его специализаций. Пожалуйста, покажите также свой вариант использования.
@SamVarshavchik Я добавил минимальный воспроизводимый пример. Надеюсь, это поможет.
Код, который вы сейчас показываете, скомпилируется без ошибок, и в нем нет шаблонов.
@user17732522 user17732522 Да, я знаю, что могу сделать указатель на функцию только из одной из специализаций. Могу ли я использовать шаблоны, чтобы всегда получать указатель функции на правильную специализацию?
@kriNon Что такое «правильная» специализация? Вот почему минимальный воспроизводимый пример, демонстрирующий, как вы хотите использовать эту функцию, был бы полезен. (Кроме того, в вашем примере кода теперь вообще нет шаблона.)
@ user17732522 Да, я это вижу. Я немного запутался, почему мой минимальный воспроизводимый пример работает, но мой реальный код выдает ошибку. Я обновлю воспроизводимый пример, чтобы он был больше похож на мой код с меньшей абстракцией. Надеюсь, это поможет сделать проблему более очевидной.
Код, показанный сейчас, не компилируется, с лавиной ошибок, которые, похоже, не имеют ничего общего с изначально заданным вопросом.
Какой бы ни была ваша проблема, это не имеет ничего общего с функцией, которая является вариативной, или с типом возвращаемого значения вашей функции. Следующий код без проблем компилируется в 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); }
Я думаю, вы правы. У меня есть: int32 AddCodeChunkInner(uint64 Hash, const TCHAR* FormattedCode, EMaterialValueType Type, EDerivativeStatus DerivativeStatus, bool bInlined);
и int32 AddCodeChunkInner(EMaterialValueType Type, EDerivativeStatus DerivativeStatus, bool bInlined, const TCHAR* Format, ...);
Можете ли вы показать минимальный воспроизводимый пример вместо неполных фрагментов кода. Хотя проблема здесь кажется очевидной (спойлер: C++ принципиально не работает таким образом), для авторитетного ответа необходим минимально воспроизводимый пример.