0

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++0xdeleteがこれを達成するための良い方法だろうと思っていました。基本的に、この関数が3つのUnicodecharタイプのいずれでもないタイプで機能しないようにしたいのですが、それでも、タイプを一般化してコードの繰り返しを回避できる関数テンプレートの利点を活用したいと考えています。

この問題を解決するための最良の方法は何でしょうか?出来ますか?

4

3 に答える 3

3

boost::enable_ifを型特性とともに使用します。

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

(あなたが定義した型特性であると仮定is_char_typeすると、それは目的の型に対して true に評価され、他のすべての型に対して false に評価されます)

于 2011-06-05T15:56:24.543 に答える
1

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 も具体的に指定する必要があります。

于 2011-06-05T16:00:38.810 に答える
0

これを行う最善の方法は、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
}
于 2015-08-02T20:07:21.140 に答える