многопоточность — C ++ Templatized проверки типов поток времени компиляции безопасно?

Есть этот стандартный способ проверки соответствия типов:

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 для умножения и инверсии матриц, в которой функция различна для каждого типа, поэтому я должен знать тип, прежде чем выполнять матричную операцию.

Спасибо.

1

Решение

Это выглядит для меня не потокобезопасным, поскольку он использует статические переменные-члены.

Он использует статический постоянная переменные-члены («константные переменные» … ^^ скажем, «статические константы-члены»). То, что часто называют «не безопасным для потоков», является статическим изменчивый переменные («изменяемые», означающие «неконстантные», необязательно определяемые с помощью ключевого слова) mutable).

Иногда вы можете увидеть код с enum { value = 0 }; (или же 1) вместо static const bool value = false; (или же true), но это часто считается «взломать», и вы теряете bool тип.

Также в C ++ 11 используйте std::is_same из шапки <type_traits> непосредственно.

3

Другие решения

Как уже говорилось в комментарии, это все проверки времени компиляции, поэтому потокобезопасность не является проблемой. Сказав это, вы всегда должны использовать наследование в проверках типов, потому что это лучший / более элегантный дизайн (за которым следуют стандартные реализации библиотеки)

Что-то вроде

 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 «значение»

1

По вопросам рекламы [email protected]