2016-07-22 3 views
1

Я пытаюсь создать шаблон для работы только с двойным и определяемым пользователем типом. Пользователь может выбрать пользовательский тип с помощью typedef во включенном файле заголовка.Пропуск явной инициализации шаблона, чтобы избежать двойной инициализации

typedef float Usertype; 

Я решил эту проблему, написав следующее в конце моего шаблона исходных файлов:

template class SpaceDiscretizer<Datatype::Usertype>; 
template class SpaceDiscretizer<double>; 

Однако я столкнулся с проблемой, когда пользователь определяет UserType в два раза! Я пытался следовать некоторым направлениям, а именно эти темы: How can I provide template specializations for typedefs of the same type?, Conditional explicit template instantiation

struct dummy{}; 
template class SpaceDiscretizer< std::conditional<std::is_same<double,Datatype::Usertype>::value, dummy, double>::type>; 
//typedef typename std::enable_if<false,double>::type mytype; 
//template class SpaceDiscretizer<mytype>; 
template class SpaceDiscretizer<Datatype::Usertype>; 

Первый не работает, потому что если SpaceDiscretizer инициализируется ничем не осложненного, за исключением двойной, он не работает. Но я хочу дать пользователю простой способ добавить рабочую альтернативу двойной функции. Вторая попытка (прокомментированная) пытается выйти из строя, потому что это не перегрузка, и если тип не существует, mytype не будет проигнорирован, но вместо этого выдается ошибка.

Edit: У меня есть много мест, где я не использовать шаблон или должен гарантировать, что несколько несвязанных классов используют один и тот же тип данных. Мне нужно сохранить реализацию в файле .cpp. Чтобы решить эту проблему, я включаю заголовочный файл во все соответствующие места, чтобы пользователь мог изменить значение в одном месте и все это было согласованным. Возникает проблема, потому что я всегда хочу инициализировать двойную, но для пользователя было бы естественно указать double как Usertype.

+1

Что-то в этом проекте поражает меня как-то необычно. Что мешает кому-то делать что-то вроде 'using UserType = int', а затем явно писать' SpaceDiscretizer '? Это не то, что вы хотели бы разрешить, но в этом случае это совершенно законно. Я подозреваю, что вы, возможно, пытаетесь сделать что-то не так. – templatetypedef

+1

информации в вопросе. однако кажется, что SpaceDiscretizer <> зависит от некоторого члена Datatype :: Usertype, которого нет в двойном. –

+0

@templatetypedef Идея состоит в том, что я рассматриваю заголовочный файл как свой собственный или образованный мир разработчиков, так и чистое использование SpaceDiscretizer в качестве ошибки «конечного пользователя». –

ответ

1

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

#include <iostream> 
#include <type_traits> 

typedef float userT; 
//typedef double userT; 

template <typename T, bool B = std::is_same<T, double>::value> 
class SpaceDiscretizer; 

template <> 
class SpaceDiscretizer<userT, false> 
{ public: static constexpr int val = 1; }; 

template <> 
class SpaceDiscretizer<double> 
{ public: static constexpr int val = 2; }; 

int main() 
{ 
    SpaceDiscretizer<userT> sd1; 
    SpaceDiscretizer<double> sd2; 

    std::cout << "sd1 val = " << sd1.val << std::endl; 
    std::cout << "sd2 val = " << sd2.val << std::endl; 

    return 0; 
} 

Выход

sd1 val = 1 
sd2 val = 2 

когда userT определяется как float и

sd1 val = 2 
sd2 val = 2 

определено как double.

p.s .: Извините за мой плохой английский.

+0

Спасибо за ваш комментарий, я просто хочу пропустить явную инициализацию. Насколько я понимаю ваше решение, я должен специализироваться на классе дважды с тем же самым старинным кодом. Я не смог сделать то же самое только с шаблоном <> class SpaceDiscretizer ; –

+0

@AYWer - извините, но я не понимаю, что вам нужно (может быть проблема с моим английским языком). Какую «явную инициализацию» вы хотите пропустить?И я не понимаю, что вы подразумеваете под «точным старинным кодом». Примите во внимание, что моя - это всего лишь пример, но вы можете изменить его во множестве разных режимов. – max66