Как передать в другую единицу трансляции имя символа?
Коротко резюмирую вопрос: Нужно получить адрес internal-linkage переменной из вне, то есть из другой единицы трансляции без геттеров. В файле, где определена internal-linkage переменная, есть функция, которая своим аргументом принимает, например, строковый литерал (имя переменной), и преобразует его в имя идентификатора (адрес internal-linkage переменной). Возможно ли провернуть такое?
Есть main.cpp и a.cpp
В a.cpp есть свои переменные с внутренним связыванием, доступные только в a.cpp и есть шаблонная функция со внешним связыванием, которая доступна во всех единицах трансляции. Эта шаблонная функция (в a.cpp) в качестве аргумента принимает одну из переменных с внутренним связыванием, определенных тоже в a.cpp.
Вопрос: как из main.cpp вызвать ту самую шаблону функцию и передать в качестве аргумента переменную с внутренним связыванием определенную в a.cpp? Нужно указать функции какой идентификатор взять в ее (функции) области видимости, а не файла main.cpp. Возможно ли такое? Адресов переменных мы не знаем, знаем только имена идентификаторов.
// main.cpp:
#include <iostream>
#include "common.h"
using namespace std;
int main()
{
cout << boolalpha
<< (&n == &GetN()) // false
<< endl;
cout << boolalpha
<< (&n == &GetT(n)) // true
<< endl;
return 0;
}
// common.h:
const int n = 0; // internal linkage
const int& GetN(); // external linkage
template<typename T>
T& GetT(T& t) {
return t;
}
// a.cpp:
#include "common.h"
const int& GetN() {
return n;
}
Нужно заменить (&n == &GetN()) на шаблонный аналог. Шаблонная функция из примера выше работает неправильно, так как передает аргументом переменную n из текущей области видимости, а должна передавать n, определенную в файле a.cpp. Результат работы шаблонной функции в примере выше должен быть false.
Нужно что-то типа (&n == &GetT(a.cpp::n)). То есть, мы можем использовать только имя идентификатора, без функции взятия адреса в файле a.cpp