В C ++ 11 тесты SFINAE стали намного красивее. Вот несколько примеров общих применений:
Выберите перегрузку функции в зависимости от признаков
template
std::enable_if_t::value> f(T t){
//integral version
}
template
std::enable_if_t::value> f(T t){
//floating point version
}
Используя так называемую икону sink типа, вы можете делать довольно произвольные тесты типа проверяя, имеет ли он член, и если этот элемент имеет определенный тип
//this goes in some header so you can use it everywhere
template
struct TypeSink{
using Type = void;
};
template
using TypeSinkT = typename TypeSink::Type;
//use case
template
struct HasBarOfTypeInt : std::false_type{};
template
struct HasBarOfTypeInt().*(&T::bar))>> :
std::is_same().*(&T::bar))>::type,int>{};
struct S{
int bar;
};
struct K{
};
template>
void print(T){
std::cout << "has bar" << std::endl;
}
void print(...){
std::cout << "no bar" << std::endl;
}
int main(){
print(S{});
print(K{});
std::cout << "bar is int: " << HasBarOfTypeInt::value << std::endl;
}
Вот живой пример: http://ideone.com/dHhyHE Я также недавно написал весь раздел о SFINAE и отправке тегов в моем блоге (бесстыдный плагин, но релевантный) http://metaporky.blogspot.de/2014/08/part-7-static-dispatch-function.html
Обратите внимание, что с C ++ 14 есть std :: void_t, который по существу совпадает с моим TypeSink здесь.
На шаге задания выполните пакет из каталога служб SSIS с помощью T-SQL и добавьте условие, чтобы проверить, активен ли уже пакет. В приведенном ниже примере catalog.executions
DMV запрашивается для пакета с заданным именем со статусом 2, который представляет текущий запущенный пакет. Если этот пакет уже найден активным, то ничего не делается, в противном случае он выполняется из хранимой процедуры catalog.start_execution
.
IF NOT EXISTS(SELECT EXECUTION_ID FROM SSISDB.CATALOG.EXECUTIONS WHERE PACKAGE_NAME = 'YourPackage.dtsx'
AND PROJECT_NAME = 'ProjectOfPackage' AND FOLDER_NAME = 'Folder Containing Package' AND [STATUS] = 2)
BEGIN
DECLARE @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'YourPackage.dtsx', @execution_id=@execution_id OUTPUT,
@folder_name=N'Folder Containing Package', @project_name=N'ProjectOfPackage'
DECLARE @var0 smallint = 2
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=50,
@parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0
EXEC [SSISDB].[catalog].[start_execution] @execution_id
END