2016-11-14 3 views
0

Я пытаюсь создать шаблон функции с реализацией по умолчанию и некоторые специализации следующим образом:Функция специализация шаблона

template <typename T> 
inline T fromBool(bool var) { return var ? T(1) : T(0); } 

template <> 
inline Vec2 fromBool<Vec2>(bool var) { return var ? Vec2(1, 1) : Vec2(0, 0); } 

// Some more specializations for Vec3, etc 

Это пример определения сложного типа Vec2:

struct Vec2 { 
    double x, y; 
    Vec2(double a, double b) { x = a; y = b; } 
} 

Однако , специализация не работает. Когда я вызываю fromBool<const Vec2>(var), компилятор использует реализацию по умолчанию (одну для простых типов).

Что я делаю неправильно?

+2

работ насколько я могу сказать Http: //ideone.com/LIRxTQ – StoryTeller

+0

@StoryTeller Обнаружена проблема: мне нужно определить это для типов 'const'. Существует ли обходное решение для переопределения всех специализаций для 'const'? – manatttta

+0

Можете ли вы изменить свой вопрос, чтобы показать актуальную проблему? – StoryTeller

ответ

4

Ваш комментарий, кажется, что вы хотите версию, которая должна работать с обоими Vec2 и const Vec2

template <typename T> 
struct fromBool_impl { 
    static T fromBool(bool var) { return var ? T(1) : T(0); } 
}; 
template <> 
struct fromBool_impl<Vec2> { 
    static Vec2 fromBool(bool var) { 
     return var ? Vec2(1, 1) : Vec2(0, 0); 
    } 
}; 

template <typename T> 
inline T fromBool(bool var) { 
    return fromBool_impl<typename std::remove_cv<T>::type>::fromBool(var); 
} 

int main() { 
    fromBool<Vec2>(true); 
    fromBool<const Vec2>(true); 
} 

Примечание: если T это ссылочный тип, поведение не определено.


выше используйте код std::remove_cv от C++ 11, это не сложно реализовать в C++ 98, вы можете найти один из возможных вариантов реализации от std::remove_cv