だから、OverLoad (link to downloadable svn directory, lib is header only)という素晴らしいライブラリがあります。それはそれに任意のタイプの機能を受け入れることができ、自動的にどちらを呼び出すかを決定することができます。それはブースト機能のようですが、より良い。 ここに2つのコードサンプルがあります(ブラウザはブーストsvnを表示できます)onetwo。Boost Overload strange behavior .. `int(int)、int(std :: string)`が `int(int)、int(std :: string)、std :: string(std :: string)`とどのように違うのですか?
#include <string>
#include <boost/detail/lightweight_test.hpp>
#include <boost/overload.hpp>
using boost::overload;
template<class out, class in>
out foo(in O)
{
std::cout << "yes we can!";
return out();
}
int main()
{
//// works
//overload<int (int), int (std::string)> f;
//// works
//int (*foo1) (int) = &foo<int, int>;
//int (*foo2) (std::string) = &foo<int, std::string>;
//f.set(foo1);
//f.set(foo2);
// or we can use
//// does also work
//f.set<int (int)>(&foo<int, int>);
//f.set<int (std::string)>(&foo<int, std::string>);
////
overload<int (int), int (std::string), std::string (std::string) > f;
//// but when we do this
//f.set<int (int)>(&foo<int, int>);
//f.set<int (std::string)>(&foo<int, std::string>);
//f.set<int (std::string)>(&foo<std::string, std::string>);
//// or this:
int (*foo1) (int) = &foo<int, int>;
int (*foo2) (std::string) = &foo<int, std::string>;
std::string (*foo3) (std::string) = &foo<std::string, std::string>;
f.set(foo1);
f.set(foo2);
f.set(foo3);
//// we get compile error
BOOST_ASSERT(f(0) == 1);
BOOST_ASSERT(f("hi") == 2); // here we get Error 1 error C3066: there are multiple ways that an object of this type can be called with these arguments
return boost::report_errors();
}
私はこの問題を回避する方法を知りましたか?
'@' myWallJSON私はあなたが今注目していると確信しています。あなたはあなたの質問の書式設定/プレゼンテーションにもっと力を注ぐことができますか?あなたは、質問を美味しくするために多くの努力を払うことなく、たくさん質問しているようです。あなたの配慮ありがとう! – sehe