Иными словами ты хочешь использовать информацию, получаемую в run-time, на этапе компиляции. Тебе не кажется, что, ээээ, причинно-следственная связь несколько нарушена?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, _Winnie, Вы писали:
B>Иными словами ты хочешь использовать информацию, получаемую в run-time, на этапе компиляции. Тебе не кажется, что, ээээ, причинно-следственная связь несколько нарушена? B> ;)
почему же в ран-тайм? адрес статического объекта известен уже на этапе компиляции.
B>>Иными словами ты хочешь использовать информацию, получаемую в run-time, на этапе компиляции. Тебе не кажется, что, ээээ, причинно-следственная связь несколько нарушена? B>>
J>почему же в ран-тайм? адрес статического объекта известен уже на этапе компиляции.
Адрес объекта с external linkage известен на этапе компиляции... точнее, шаблон может быть параметризирован таким адресом. Насчет статического объекта я не припомню такого, по крайней мере comeau ругается на попытку параметризировать шаблон адресом статической переменной. С extern это вполне проходит. Впрочем, мне тоже непонятно, почему компилятор не в состоянии определить адрес статической переменной на этапе компиляции.
Здравствуйте, Andrew S, Вы писали:
AS>Адрес объекта с external linkage известен на этапе компиляции... точнее, шаблон может быть параметризирован таким адресом. Насчет статического объекта я не припомню такого, по крайней мере comeau ругается на попытку параметризировать шаблон адресом статической переменной. С extern это вполне проходит. Впрочем, мне тоже непонятно, почему компилятор не в состоянии определить адрес статической переменной на этапе компиляции.
Статический член имеет external linkage — Jazzer абсолютно прав.
Comeau конечно же компилит во это:
struct test
{
static int n_;
};
int test::n_ = 0;
template<int* p>
int fn()
{
return *p;
}
int main()
{
int a = fn<&test::n_>();
return 0;
}
Здравствуйте, Andrew S, Вы писали:
B>>>Иными словами ты хочешь использовать информацию, получаемую в run-time, на этапе компиляции. Тебе не кажется, что, ээээ, причинно-следственная связь несколько нарушена? B>>> ;)
J>>почему же в ран-тайм? адрес статического объекта известен уже на этапе компиляции.
AS>Адрес объекта с external linkage известен на этапе компиляции... точнее, шаблон может быть параметризирован таким адресом. Насчет статического объекта я не припомню такого, по крайней мере comeau ругается на попытку параметризировать шаблон адресом статической переменной. С extern это вполне проходит. Впрочем, мне тоже непонятно, почему компилятор не в состоянии определить адрес статической переменной на этапе компиляции.
9.4.2/6
Static data members of a class in namespace scope have external linkage (3.5).
AS>>Адрес объекта с external linkage известен на этапе компиляции... точнее, шаблон может быть параметризирован таким адресом. Насчет статического объекта я не припомню такого, по крайней мере comeau ругается на попытку параметризировать шаблон адресом статической переменной. С extern это вполне проходит. Впрочем, мне тоже непонятно, почему компилятор не в состоянии определить адрес статической переменной на этапе компиляции.
B>Статический член имеет external linkage — Jazzer абсолютно прав.
Извиняюсь, но где речь шла про member? Говорилось о статическом объекте. Это немного разные вещи.
Здравствуйте, Andrew S, Вы писали:
AS>>>Адрес объекта с external linkage известен на этапе компиляции... точнее, шаблон может быть параметризирован таким адресом. Насчет статического объекта я не припомню такого, по крайней мере comeau ругается на попытку параметризировать шаблон адресом статической переменной. С extern это вполне проходит. Впрочем, мне тоже непонятно, почему компилятор не в состоянии определить адрес статической переменной на этапе компиляции.
B>>Статический член имеет external linkage — Jazzer абсолютно прав.
AS>Извиняюсь, но где речь шла про member? Говорилось о статическом объекте. Это немного разные вещи.
речь про member шла в начальном посте.
я же в контексте пишу :)
Может специализировать XToType для всех типов, которые у тебя используются. А по умолчанию сделать шаблон, который бы генерил ошибку при инстациировании (Как у Александреску)?
Я все — таки хотел сделать макрос typeof(). Проблема была только в этом. Я, кажется, понял свою ошибку.
Если есть шаблон вроде template <char *c> struct XToType { по адресу выясняем тип } и в качестве параметра подтавляем адрес статической переменной, то ничего не выйдет. Ибо тип должен определится во время компиляции, а значение указателя становится только во время линкования [offtop](как это по-русски? редактирование связей?)[/offtop].
Так что прервый пост от господина Bell был отчасти верен.
Невозможно в compile-time выяснить то, что становится известно только в link-time. У меня хромает причинно-следсвенноя связь.
Вопрос: когда в C++ появится typeof ?
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, _Winnie, Вы писали:
_W>Я все — таки хотел сделать макрос typeof(). Проблема была только в этом. Я, кажется, понял свою ошибку. _W>Если есть шаблон вроде template <char *c> struct XToType { по адресу выясняем тип } и в качестве параметра подтавляем адрес статической переменной, то ничего не выйдет. Ибо тип должен определится во время компиляции, а значение указателя становится только во время линкования [offtop](как это по-русски? редактирование связей?)[/offtop].
_W>Так что прервый пост от господина Bell был отчасти верен. _W>Невозможно в compile-time выяснить то, что становится известно только в link-time. У меня хромает причинно-следсвенноя связь.
_W>Вопрос: когда в C++ появится typeof ?
_Winnie wrote:
> Вот есть такой шаблон, который отображает каждый тип в уникальное число (адрес статической переменной)
[]
> А как сделать обратное отображение?
[]
Можно попробовать заюзать blessed visitor pattern:
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Bell, Вы писали:
B>>Здравствуйте, _Winnie, Вы писали:
B>>Иными словами ты хочешь использовать информацию, получаемую в run-time, на этапе компиляции. Тебе не кажется, что, ээээ, причинно-следственная связь несколько нарушена? B>>
J>почему же в ран-тайм? адрес статического объекта известен уже на этапе компиляции.
Не совсем. Только как некий символ. А реальное значение он получит окончательно, скорее всего, только после загрузки приложения.
Жалко ещё, что нельзя ещё вот так делать: my_vector.iterator v = my_vector.begin();
Потому что тогда с лёгкостью можно было бы определить макрос typeof