2015-10-08 5 views
2

У меня есть класс вроде этого:шаблон класса отличается типом возвращаемого значения зависит от класса параметры

template<class T> 
class A{ 
    // lots of methods here 

    Something get(); 
}; 

Я хочу Something get() стать const Something &get(), если T является конкретным классом.

Сначала я попытался сделать это с наследованием, но он стал слишком грязным.

Могу ли я сделать это, не специализируясь на целом class A и без введения второго шаблона.

+1

возможно станд :: enable_if поможет вам в этом случае? Некоторое решение SFINAE. –

+1

Вам нужно использовать специализированную специализацию. Однако вам может не понадобиться специализироваться на полном объеме A. У вас есть небольшой трюк, когда Something get() находится в шаблоне B. Вы можете специализироваться на этом и иметь наследование от него, чтобы получить предполагаемую форму функции. – qeadz

+0

Возможный дубликат [Переопределение возвращаемого типа в специализированной функции) [http://stackoverflow.com/questions/15911890/overriding-return-type-in-function-template-specialization) –

ответ

5

Вы просто запишите это на простом, удобном в использовании английском языке.

std::conditional<std::is_same<T, SpecificClass>::value, 
       Something const&, 
       Something>::type get(); 
2

Вы можете использовать std::conditional как объяснена н.м., или, если вам нужно другое поведение методов, которые вы можете использовать std::enable_if:

struct Something { }; 

template<typename T> 
class Foo 
{ 
    Something something; 
public: 
    template<typename U = T, typename std::enable_if<!std::is_same<U, float>::value, int>::type = 0> Something get() { 
    std::cout << "not specialized called" << std::endl; 
    return something; 
    } 

    template<typename U = T, typename std::enable_if<std::is_same<U, float>::value, int>::type = 0> const Something& get() { 
    std::cout << "specialized called" << std::endl; 
    return something; 
    } 
}; 


Something sm1 = Foo<float>().get(); 
Something sm2 = Foo<int>().get(); 

 Смежные вопросы

  • Нет связанных вопросов^_^