Получение правильной информации о типе для функции, возвращающей указатель на функцию, который использует вариативные шаблоны

У меня есть вариационная функция, определенная в классе 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;}
};

Вариационная функция и вариативный шаблон — это разные вещи. Непонятно, что вы имеете в виду. В сообщении об ошибке также говорится, что существует несколько перегрузок, о которых вы не упомянули. Вы не можете сделать указатель функции из шаблона функции, только из одной из его специализаций. Пожалуйста, покажите также свой вариант использования.

user17732522 14.10.2022 03:05

@SamVarshavchik Я добавил минимальный воспроизводимый пример. Надеюсь, это поможет.

kriNon 14.10.2022 03:15

Код, который вы сейчас показываете, скомпилируется без ошибок, и в нем нет шаблонов.

user17732522 14.10.2022 03:18

@user17732522 user17732522 Да, я знаю, что могу сделать указатель на функцию только из одной из специализаций. Могу ли я использовать шаблоны, чтобы всегда получать указатель функции на правильную специализацию?

kriNon 14.10.2022 03:18

@kriNon Что такое «правильная» специализация? Вот почему минимальный воспроизводимый пример, демонстрирующий, как вы хотите использовать эту функцию, был бы полезен. (Кроме того, в вашем примере кода теперь вообще нет шаблона.)

user17732522 14.10.2022 03:19

@ user17732522 Да, я это вижу. Я немного запутался, почему мой минимальный воспроизводимый пример работает, но мой реальный код выдает ошибку. Я обновлю воспроизводимый пример, чтобы он был больше похож на мой код с меньшей абстракцией. Надеюсь, это поможет сделать проблему более очевидной.

kriNon 14.10.2022 03:26

Код, показанный сейчас, не компилируется, с лавиной ошибок, которые, похоже, не имеют ничего общего с изначально заданным вопросом.

Sam Varshavchik 14.10.2022 04:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Какой бы ни была ваша проблема, это не имеет ничего общего с функцией, которая является вариативной, или с типом возвращаемого значения вашей функции. Следующий код без проблем компилируется в 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, ...);

kriNon 14.10.2022 03:32

Другие вопросы по теме

Похожие вопросы