Как определить новую функцию / структуру / класс тогда и только тогда, когда это не вызывает ошибки переопределения?

#c #c 20 #sfinae #redefinition

#c #c 20 #sfinae #переопределение

Вопрос:

Я генерирую код на c , и мне нужно определить новую функцию / структуру / класс тогда и только тогда, когда это не вызывает ошибки переопределения. Как я могу этого добиться? Я думаю, что решением было бы попытаться переопределить новую функцию / структуру / класс и сделать так, чтобы она вышла из строя удобным для SFINAE способом, но я понятия не имею, как это сделать.

Например:

 int foo (int x, int y) { 
   return x   y;
}

int foo (int z, int a) { // Obvious redefinition here, how can I make it fail in a SFINAE friendly way?
   return x * y;
} 

template <typename T, typename U>
struct bar {};

template <typename T, typename U> // Partial template specialisation does not actually specialise the parent template, how do I make this definition fail in a SFINAE friendly way?
struct bar<T, U> {}; 
 

Комментарии:

1. если вы добавляете template в foo , это уже не та же функция…

2. Если вы создаете код на C , вы можете перенести эту проблему в свою процедуру построения (например Makefile )

3. Это проблема метапрограммирования, которую, к сожалению, vanilla C просто не в состоянии решить. Вам понадобится помощь от внешнего генератора кода.

4. Похоже, вам нужно сделать что-то вроде того, как работает intellesense, где у вас в основном есть собственный компилятор, разбейте код на все символы в нем, а затем обратитесь к этой таблице символов, когда вам нужно что-то сгенерировать.

5. Не очень красивое решение, но вы могли бы добавить #ifdef и #define к каждой функции, которая однозначно определяется сигнатурой функции. Таким образом, дубликаты вместо этого разрешаются препроцессором. Случай с шаблоном сложен, потому что, как сказал Натан, для определения дубликатов потребуется, по сути, полный набор инструментов. Может быть, заглянуть в инструменты clang AST.