Чтобы получить это от звукового компонента, прикрепленного к элементу, вы можете записать
var mySound = document.querySelector('#yourElement').components.sound.attrValue.src
, затем
var myAudioDuration = document.querySelector(mySound).duration
И продолжительность будет сохранена в этой переменной.
В качестве альтернативы, если ваш аудиофайл сохранен в активах с идентификатором 'myAudio', например
Вы можете написать
var myAudioDuration = document.querySelector('#myAudio').duration
И длительность будет сохранена в этой переменной.
Надеюсь, что это поможет
. Вы можете больше узнать об элементах управления аудио / видео тегами здесь
Код:
template<>
std::map<int, std::vector<std::string> > Storage<int>::things = {
{ 1, {"FOO", "foo"} },
{ 2, {"BAR", "bar"} },
{ 3, {"ZAR", "zar"} }
};
- это не специализация шаблона класса Storage
, а специализация статического члена данных шаблона класса .
Член класса шаблона может быть специализированным (при условии, что нет нестатических членов данных). То есть можно специализировать весь класс шаблона в целом, как в:
template<class T>
struct A{
struct B{
using type = T;
};
void g();
};
template<>
struct A<void>{}; //specialize the entire class.
Или специализировать только элемент шаблона класса:
//Specialization of B for A<int>
template<>
struct A<int>::B{
static int f();
};
Вышеуказанная специализация члена эквивалентно специализации шаблонного класса:
template<>
struct A<int>{
struct B{ //come from the member specialization definition
static int f();
};
void g(); //come from unspecialized A definition.
};
В результате вы можете наблюдать это, если попытаетесь скомпилировать:
A<char>::B::type x = `a`;
A<double>::B::type y = `b`;
A<int>::B::type err; //compilation error
int z = A<int>::B::f(); //ok.
A<void>::B o; //compilation error
auto w = A<void>::f(); //compilation error