#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.