Шаблонное метапрограммирование с массивами символов как параметры

Я скачал cuda 10.0 по следующей ссылке CUDA 10.0

Затем я установил его с помощью следующих команд:

sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-10-0

Затем я установил cudnn v7.5.0 для CUDA 10.0 перейдите по ссылке CUDNN download и вам необходимо войти в систему, используя учетную запись.

и после выбора правильной версии я скачал по ссылке CUDNN power link , после чего я добавил файлы include и lib для cudnn следующим образом:

sudo cp -P cuda/targets/ppc64le-linux/include/cudnn.h /usr/local/cuda-10.0/include/
sudo cp -P cuda/targets/ppc64le-linux/lib/libcudnn* /usr/local/cuda-10.0/lib64/
sudo chmod a+r /usr/local/cuda-10.0/lib64/libcudnn*

После изменения .bashrc для lib и path of cuda 10.0, если у вас его нет, вам нужно добавить их в .bashrc

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

И после всех этих шагов мне удалось успешно импортировать тензор потока в python3.

12
задан Xeo 17 September 2012 в 00:12
поделиться

7 ответов

К сожалению, все еще необходимо разделить его на отдельные символы, например:

myTemplate<'s','t','r','i','n','g'>

По моему скромному мнению это - огромный контроль в новом стандарте. Некоторые другие люди, согласованные и попробованные для реализации поведения в GCC с довольно хорошими результатами. Можно найти тот поток здесь.

Править: Некоторые странные проблемы со ссылкой, таким образом вырезанной и вставленной от этого:

http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/9b0edd169ba2ce3c

9
ответ дан 2 December 2019 в 05:42
поделиться

Попробуйте это:

extern const char SOMESTRING[] = "stringhere"; //extern linkage required!

template<const char * const STR>
struct MyStruct
{
  static std::string doThis() { return STR; }
};



MyStruct<SOMESTRING>   testObj; //ok!

Крис

3
ответ дан 2 December 2019 в 05:42
поделиться

Я решил проблему, подобную этому. Нам был нужен другой тип для каждого имени

template< const char* the_name >
class A
{
    public:
    const char* name( void )
    {
        return the_name;
    }
};

extern const char g_unique_name[]; // defined elsewhere
typedef A<g_unique_name> A_unique;

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

Если Вы хотите доступ отдельного символа, единственный способ достигнуть его с определяемым пользователем литералом. C++ 0x будет расширен для разрешения синтаксиса в основной функции выше, но это все еще свяжет шаблон с символьным указателем не к массиву времени компиляции символов.

10
ответ дан 2 December 2019 в 05:42
поделиться

Я не уверен, чего Вы хотите достигнуть, но когда Вы передаете "asdf" шаблону, это - тип, символ *, и значение является адресом строки. Таким образом простой подход как обрисованный в общих чертах тот перестанет работать. Трудно рекомендовать что-либо, не зная, какую проблему Вы пытаетесь решить во-первых.

0
ответ дан 2 December 2019 в 05:42
поделиться

Вы не можете сделать этого. От 14.3.2 в стандарте:

Аргумент шаблона для нетипа, нешаблонный шаблонный параметр должен быть одним из:

  • интегральное константное выражение интеграла или перечисляемого типа; или
  • название шаблонного параметра нетипа; или
  • адрес объекта или функции с внешней связью, включая шаблоны функций и идентификаторы шаблона функции, но, исключая нестатических участников класса, выраженных как и идентификационное выражение, где и является дополнительным, если имя относится к
  • функция или массив, или если соответствующий шаблонный параметр является ссылкой; или
  • константное выражение, которое оценивает к значению нулевого указателя (4.10); или
  • константное выражение, которое оценивает к пустому членскому значению указателя (4.11); или
  • указатель на участника выразил, как описано в 5.3.1.
  • [Примечание: строковый литерал (2.13.4) не удовлетворяет требования ни одной из этих категорий и таким образом не является приемлемым аргументом шаблона
0
ответ дан 2 December 2019 в 05:42
поделиться

Кавычка из нового стандартного проекта:

14.3.2 Обработайте неаргументы типа по шаблону [temp.arg.nontype]

2 Примечания: строковый литерал (2.13.4) не удовлетворяет требования ни одной из этих категорий и таким образом не является приемлемым аргументом шаблона.

Пример:

template<class T, char* p>
class X 
{ 
X(); 
X(const char* q) { /... / } 
}; 

X<int, "Studebaker"> x1; // error: string literal as template-argument char p[] = "Vivisectionist";
X<int,p> x2; // OK

Попробуйте это, но я не уверен, потому что в http://gcc.gnu.org/gcc-4.3/cxx0x_status.html не говорится никто об этой функции.

0
ответ дан 2 December 2019 в 05:42
поделиться

« строка » недавно был добавлен в Boost.MPL, что позволяет писать :

typedef mpl::string<'asdf'> asdf;
typedef mpl::push_back<asdf, mpl::char_<'!'> >::type asdf_bang;

BOOST_ASSERT(0 == std::strcmp(mpl::c_str<asdf_bang>::value, "asdf!"));

Обратите внимание, что показанный выше пример немного надуман, так как «строки», состоящие из более чем 4 символов, должны быть разделены. Например:

typedef mpl::string<'hell','o wo','rld'> hello;
3
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: