特に特別なことは特にありません。テンプレートに利用可能な関数のバージョンがあることを確認し、ADLに汚い作業をさせてください。この例を確認してください:
#include <iostream>
namespace bob {
struct X {};
void f(X const&) { std::cout << "bob::f\n"; }
}
namespace ed {
template < typename T >
void f(T const&) { std::cout << "ed::f\n"; }
template < typename T >
struct test
{
void doit() // not called f and no other member so named.
{ f(T()); }
};
}
int main()
{
ed::test<int> test1;
ed::test<bob::X> test2;
test1.doit();
test2.doit();
std::cin.get();
}
あまりにも(非テンプレートが優先されます)名前空間のものなしで動作します。私はちょうどあなたがそうしたときにADLがそれを取り上げることを示すためにそれを使用しました。
元の質問は面白かったです。 C++ 0xの中でそれを行う方法を発見:
template < typename T >
struct fun_exists
{
typedef char (&yes) [1];
typedef char (&no) [2];
template < typename U >
static yes check(decltype(f(U()))*);
template < typename U >
static no check(...);
enum { value = sizeof(check<T>(0)) == sizeof(yes) };
};
void f(double const&) {}
struct test {};
#include <iostream>
int main()
{
std::cout << fun_exists<double>::value << std::endl;
std::cout << fun_exists<test>::value << std::endl;
std::cin.get();
}
ない重複:http://stackoverflow.com/questions/257288/is-it-possible-to-write-ac-template-to-機能の有無を確認するために – krlmlr