void(* func)(T)型とfuncの引数argの関数をとるファンクターFを書いています。
template<typename T>
void F(void (*func)(T), WhatTypeHere? arg)
{
func(arg);
}
次に、ファンクターFはargを使用してfuncを呼び出します。Fはargをコピーせず、参照として渡すだけにします。しかし、Tが参照になる可能性があるため、単純に「void F(void(* func)(T)、T&)」と書くことはできません。だから私はTの適切な参照型を取得することを可能にする特性を書き込もうとしています:
T -> T&
T& -> T&
const T -> const T&
const T& -> const T&
私はこのようなものを思いつきます:
template<typename T>
struct type_op
{
typedef T& valid_ref_type;
};
template<typename T>
struct type_op<T&>
{
typedef typename type_op<T>::valid_ref_type valid_ref_type;
};
template<typename T>
struct type_op<const T>
{
typedef const T& valid_ref_type;
};
template<typename T>
struct type_op<const T&>
{
typedef const T& valid_ref_type;
};
template<typename T>
void F(void (*func)(T), typename type_op<T>::valid_ref_type arg)
{
func(arg);
}
たとえば、これは機能しません
void a(int x) { std::cout << x << std::endl; }
F(&a, 7);
エラーの発生:「voidF(void(*)(T)、typename type_op :: valid_ref_type)[with T = int]'</ p>
この特性を機能させる方法は?