Тот факт, что A::B b = A().getB()
не работает, состоит в том, что B
является частным членом класса A
. Если вы сделаете это общедоступным, тогда ваш код будет скомпилирован. Он работает с auto
, потому что auto
просто проверяет тип назначенного ему объекта, не требуя вызова конструктора объекта (как declval
). Поэтому он присваивает b
возвращаемый тип getB
, присутствующий в классе A
. Вы также можете изменить свой код следующим образом:
decltype( declval<A>().getB() ) b = A().getB();
(Если declval
является новым для вас, то я должен сказать вам, что он вернет rvalue возвращаемого типа функции (здесь getB
, тип возвращаемого типа B
) класса (здесь A
) без вызова конструктора класса! (Однако это следует использовать только с функциями, такими как decltype
и sizeof
.) Таким образом, он предотвращает накладные расходы на создание объекта класса, а затем использование его функции.)
Теперь, по моему мнению, я не думаю, что это лазейка в стандарте, но я чувствую, что лазейка была удалена! Это видно из вашего собственного кода, см. Функцию getB
. Как сложно создать экземпляр объекта B
, потому что он определен частным! В таком случае работа с B
становится затруднительной. Идея этого заключается в том, что имя типа (т.е. B
) в классе A
недоступно, но тип все еще используется, поэтому вы можете получить объект B
. Вы можете понять использование auto
, если вы понимаете этот код шаблона: -
#include <iostream>
#include <type_traits> // for std::is_same
using namespace std;
class A
{
class B
{};
public:
B getB()
{
return B();
}
};
template<typename T>
void check (T b)
{
cout<<boolalpha;
is_same<decltype( declval<A>().getB() ), T> x; // checks if T & B are of same type
cout<<x.value<<'\n';
}
int main()
{
A obj;
check (obj.getB());
return 0;
}
Выход: -
true
Поскольку template
может идентифицировать B
], поэтому auto
также идентифицирует B
.
Это должно добиться цели, просто добавить в дополнительных типах при необходимости в них:
select
so.name table_name
,sc.name column_name
,st.name data_type
from sysobjects so
inner join syscolumns sc on (so.id = sc.id)
inner join systypes st on (st.type = sc.type)
where so.type = 'U'
and st.name IN ('DATETIME', 'DATE', 'TIME')
редактирование: это также работает в Sybase и любых других вариантах T-SQL.
Это использует INFORMATION_SCHEMA на таблицах в текущей базе данных.
Протестированный в SQL Server 2008.
select distinct c.TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS as c
where c.DATA_TYPE = 'datetime'
Другой запрос для SQL 2005/2008 использование системных представлений:
select tbl.name as 'Table', c.name as 'Column Name', t.name as 'Type'
from sys.columns as c
inner join sys.tables as tbl
on tbl.object_id = c.object_id
inner join sys.types as t
on c.system_type_id = t.system_type_id
where t.name in ('datetime', 'date')
order by tbl.name