Мои расширения преобразования, которые позволяют Вам делать:
int i = myString.To();
Здесь это, , как отправлено на TheSoftwareJedi.com
public static T To(this IConvertible obj)
{
return (T)Convert.ChangeType(obj, typeof(T));
}
public static T ToOrDefault
(this IConvertible obj)
{
try
{
return To(obj);
}
catch
{
return default(T);
}
}
public static bool ToOrDefault
(this IConvertible obj,
out T newObj)
{
try
{
newObj = To(obj);
return true;
}
catch
{
newObj = default(T);
return false;
}
}
public static T ToOrOther
(this IConvertible obj,
T other)
{
try
{
return Toobj);
}
catch
{
return other;
}
}
public static bool ToOrOther
(this IConvertible obj,
out T newObj,
T other)
{
try
{
newObj = To(obj);
return true;
}
catch
{
newObj = other;
return false;
}
}
public static T ToOrNull
(this IConvertible obj)
where T : class
{
try
{
return To(obj);
}
catch
{
return null;
}
}
public static bool ToOrNull
(this IConvertible obj,
out T newObj)
where T : class
{
try
{
newObj = To(obj);
return true;
}
catch
{
newObj = null;
return false;
}
}
можно попросить значение по умолчанию (вызовы очищают конструктора или "0" для численных данных) при отказе, определите значение "по умолчанию" (я называю его "другим"), или попросите пустой указатель (где T: класс). Я также предоставил и тихие модели исключения и типичную модель TryParse, которая возвращает bool указание на меры, принятые, и, параметрический усилитель содержит новое значение. Таким образом, наш код может сделать вещи как это
int i = myString.To();
string a = myInt.ToOrDefault();
//note type inference
DateTime d = myString.ToOrOther(DateTime.MAX_VALUE);
double d;
//note type inference
bool didItGiveDefault = myString.ToOrDefault(out d);
string s = myDateTime.ToOrNull();
, я не мог заставить типы Nullable прокручиваться во все это очень чисто. Я попробовал в течение приблизительно 20 минут, прежде чем я признал себя побежденным.
Для VS2003 есть флаг / showIncludes ( в свойствах C / C ++ / Advanced). Это напечатает все заголовки, которые включает в себя каждый файл .cpp, и все, что они включают, так что вы можете перейти оттуда.
Я уверен, что в том же месте есть тот же вариант для VS2008.
если вы используете компиляторы GCC, попробуйте этот
g++ -M abc.cpp
, он покажет все включаемые зависимости для файла abc.cpp
Ваша ситуация напоминает мне мою собственную. У меня есть куча созданных мной заголовков, которые я использую в качестве библиотеки вместо того, чтобы возиться с DLL.
Конечно, циклическое включение может вызвать проблемы, поэтому я обнаружил, что такой инструмент, как Visual Assist X (1) помогает в подобных делах. В нем есть функция, которая может находить ссылки на материал, так что вы можете легко отсеять, где что-то определяется / объявляется / включается и т. Д. Он также имеет множество других полезных функций, поэтому я считаю его довольно полезным.
Вероятно, существуют другие инструменты / плагины, которые имеют функцию ссылки, но обычно как одну из функций среди других функций рефакторинга и повышения производительности утилиты.
HTH
Это довольно утомительно, но вы можете выполнить двоичный поиск пути к месту, где происходит #include, используя #error (и #pragma message), чтобы сузить область включения строки, которую тянет третья сторона . Я сделал это в случае одного файла, который пытался отследить, но похоже, что ваша проблема серьезнее, поэтому, вероятно, один из инструментов, упомянутых другими, будет более эффективным.