2015-02-09 2 views
2

Я смотрел следующее сообщение write a boost::multi_array to hdf5 dataset и не мог понять синтаксис, используемый для шаблонов в первом ответе Льва Гудстадта. К сожалению, у меня недостаточно репутации, чтобы прокомментировать прямо ответ на этот вопрос, поэтому я создал этот отдельный вопрос.Объяснение синтаксиса шаблона C++

Насколько я понял, существует структура, созданная со статическим методом type(), который возвращает соответствующий тип.

Эта обобщенная структура затем перезаписывается одним фиксированным типом. Но что именно там написано в фигурных скобках, то есть в чем его смысл? Например, какой смысл в следующем:

{ H5::IntType type { H5::PredType::NATIVE_CHAR 
        }; 
}; 

в первом определении полукокса-шаблоне:

template<> struct get_hdf5_data_type<char> { 
    H5::IntType type { 
     H5::PredType::NATIVE_CHAR  
    }; 
}; 

Я скопировал ниже основные части определения шаблона, но, вероятно, легче смотреть на оригинальное сообщение для четкой картины.

template<typename T> struct get_hdf5_data_type { 
    static H5::PredType type() { 
     //static_assert(false, "Unknown HDF5 data type"); 
     return H5::PredType::NATIVE_DOUBLE; 
    } 
}; 
template<> struct get_hdf5_data_type<char> { 
    H5::IntType type { H5::PredType::NATIVE_CHAR }; 
}; 
template<> struct get_hdf5_data_type<long long> { 
    H5::IntType type { H5::PredType::NATIVE_LLONG }; 
}; 
template<> struct get_hdf5_data_type<unsigned long long> { 
    H5::IntType type { H5::PredType::NATIVE_ULLONG }; 
}; 
template<> struct get_hdf5_data_type<int8_t> { 
    H5::IntType type { H5::PredType::NATIVE_INT8 }; 
}; 
+5

* К сожалению, у меня недостаточно репутации, чтобы прокомментировать прямо ответ на этот вопрос, поэтому я создал этот отдельный вопрос. * - Аллилуйя, система работает! Вопросы относятся к новым вопросам. – chris

ответ

0

Кудрявая синтаксис инициализации

H5::IntType type { H5::PredType::NATIVE_CHAR  }; 

сходно с

H5::IntType type = H5::PredType::NATIVE_CHAR; 

Я не знаком с H5, но OP затем использует его в качестве hdf_data_type.type, который просто ссылаюсь на определенный тип, ранее определенный в вашем списке специализаций.

В настоящее время hdf_data_type должен быть одним из предоставленных специализированных специализированных шаблонов, например get_hdf5_data_type<char>, для обеспечения определения типа.

Прокомментированный static_assert в шаблоне общего назначения можно использовать в качестве маркера, который не известен для известной специализации, и объект hdf_data_type не пригодится.

+0

спасибо за ответ, синтаксис теперь мне понятен. Но не тип метода() бесполезен, поскольку, когда неизвестная специализация не найдена, вы получаете указатель на функцию вместо типа? – Udo

+0

Я попытался скомпилировать код OP, но похоже, что этот синтаксис не работает с ошибкой компиляции: ** main.cpp: 32: 15: ошибка: определение функции не объявляет параметры ** – Udo

+0

@Udo Что касается вашего первого вопроса, это будет зависеть от использования, но мне кажется, что намерение состоит в том, чтобы скомпилировать компиляцию с помощью static_assert. И разные специализации - это несвязанные типы. Что касается 2 - это, вероятно, заслуживает нового вопроса, поскольку я не могу определить, к какой строке относится ошибка. –