C ++ 0x Функция delete - Удалить все кроме определенных типов - PullRequest
0 голосов
/ 05 июня 2011

В C ++ 0x я могу сделать что-то вроде этого:

double f(double x) { return x; }
template<class T>
  T f(T x) = delete;

Чтобы запретить вызов f() для любого другого типа, кроме double.

Что яЯ пытаюсь сделать это похоже, однако, не совсем то же самое.

У меня есть функция, которая работает с массивами указателей.Например:

template<class T>
  T* some_string_function(T* x);

Я хочу, чтобы T мог работать для char, char16_t и char32_t, но не для любого другого типа.Я думал, что C ++ 0x delete будет хорошим способом для достижения этой цели.По сути, я хочу, чтобы эта функция не работала с любым типом, который не относится к трем типам Unicode char, но я все же хочу использовать преимущества шаблонов функций, которые позволяют мне обобщать типы и избегатьповторяющийся код.

Как лучше всего решить эту проблему?Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Используйте boost::enable_if вместе с чертами типа.

template<class T>
T* some_string_function(T* x, boost::enable_if<is_char_type<T>);

(при условии, что is_char_type - это определенная вами черта типа, которая оценивается как true для желаемых типов и false для всех остальных)

1 голос
/ 05 июня 2011

Вы можете сделать это, используя type_traits:

template<typename T>
typename enable_if<is_same<char, T>::value || is_same<char16_t, T>::value || is_same<char32_t, T>::value, T*>::type some_string_function(T *x)
{
    return x;
}

Несмотря на то, что вам нужно было бы специально указать и const, если вы хотите это разрешить.

0 голосов
/ 02 августа 2015

Я думаю, что лучший способ сделать это - использовать комбинацию static_assert и is_same (обе функции C ++ 0x).Это также позволяет получить более понятное сообщение об ошибке при неправильном вызове функции.

#include <iostream>
using namespace std;

template<typename T> T* f(T*)
{
    static_assert
    (is_same<T, char>::value
     || is_same<T, char16_t>::value
     || is_same<T, char32_t>::value,
     "Invalid Type, only char pointers allowed");
}

int main()
{
    cout<<*f(new char('c'));//Compiles
    cout<<*f(new int(3));//Error
}
...