Есть этот стандартный способ проверки соответствия типов:
template<class T, class U>
struct is_same { static const bool value = false; };
template<class T>
struct is_same<T, T> { static const bool value = true; };
И я использую это так:
if (SamTypeCheck<double,double>::value)
cout<<"same"<<endl;
else
cout<<"different"<<endl;
if (SamTypeCheck<int,double>::value)
cout<<"same"<<endl;
else
cout<<"different"<<endl;
Это выглядит для меня не потокобезопасным, поскольку он использует статические переменные-члены. Это действительно не потокобезопасный? Код как-то меня смутил. Какая замена этому, чтобы иметь что-то многопоточное с той же функциональностью?
Зачем мне это нужно?
У меня есть шаблонный класс для работы с матрицами, и я хочу использовать математическую библиотеку Intel Compiler Math Kernel для умножения и инверсии матриц, в которой функция различна для каждого типа, поэтому я должен знать тип, прежде чем выполнять матричную операцию.
Спасибо.
Это выглядит для меня не потокобезопасным, поскольку он использует статические переменные-члены.
Он использует статический постоянная переменные-члены («константные переменные» … ^^ скажем, «статические константы-члены»). То, что часто называют «не безопасным для потоков», является статическим изменчивый переменные («изменяемые», означающие «неконстантные», необязательно определяемые с помощью ключевого слова) mutable
).
Иногда вы можете увидеть код с enum { value = 0 };
(или же 1
) вместо static const bool value = false;
(или же true
), но это часто считается «взломать», и вы теряете bool
тип.
Также в C ++ 11 используйте std::is_same
из шапки <type_traits>
непосредственно.
Как уже говорилось в комментарии, это все проверки времени компиляции, поэтому потокобезопасность не является проблемой. Сказав это, вы всегда должны использовать наследование в проверках типов, потому что это лучший / более элегантный дизайн (за которым следуют стандартные реализации библиотеки)
Что-то вроде
template<typename U, typename T> struct is_same : public std::false_type {};
template<typename T> struct is_same<T, T> : public std::true_type {};
Тип std :: true / false содержит std :: integra_constant «значение»