summaryrefslogtreecommitdiffstats
path: root/base/template_util.h
diff options
context:
space:
mode:
authorajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 22:37:58 +0000
committerajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-16 22:37:58 +0000
commitba019acba16af46f1cfcd48f55668d430290f8b6 (patch)
treecd21c0b816c1ca3952711d416d6c9336208b133b /base/template_util.h
parent12c886cdaa29bd2c419bf6c119942378dc7db1ce (diff)
downloadchromium_src-ba019acba16af46f1cfcd48f55668d430290f8b6.zip
chromium_src-ba019acba16af46f1cfcd48f55668d430290f8b6.tar.gz
chromium_src-ba019acba16af46f1cfcd48f55668d430290f8b6.tar.bz2
Fix is_convertible for windows.
It turns out that if you nest a template inside the initializer list of another template, the namelookup in windows gets all funky. In this case, it couldn't tell that the found name was a function. Luckily, we could just move the template parameters one level deeper. BUG=none TEST=unittests & trybots. Review URL: http://codereview.chromium.org/6537001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75194 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/template_util.h')
-rw-r--r--base/template_util.h23
1 files changed, 11 insertions, 12 deletions
diff --git a/base/template_util.h b/base/template_util.h
index 0408fc6..e48af91 100644
--- a/base/template_util.h
+++ b/base/template_util.h
@@ -47,8 +47,6 @@ struct NoType {
YesType dummy[2];
};
-#if !defined(OS_WIN)
-
// This class is an implementation detail for is_convertible, and you
// don't need to know how it works to use is_convertible. For those
// who care: we declare two different functions, one whose argument is
@@ -58,15 +56,17 @@ struct NoType {
// had called it with an argument of type From. See Alexandrescu's
// _Modern C++ Design_ for more details on this sort of trick.
-template <typename From, typename To>
struct ConvertHelper {
+ template <typename To>
static YesType Test(To);
+
+ template <typename To>
static NoType Test(...);
+
+ template <typename From>
static From Create();
};
-#endif // !defined(OS_WIN)
-
// Used to determine if a type is a struct/union/class. Inspired by Boost's
// is_class type_trait implementation.
struct IsClassHelper {
@@ -79,19 +79,18 @@ struct IsClassHelper {
} // namespace internal
-#if !defined(OS_WIN)
-
// Inherits from true_type if From is convertible to To, false_type otherwise.
+//
+// Note that if the type is convertible, this will be a true_type REGARDLESS
+// of whether or not the conversion would emit a warning.
template <typename From, typename To>
struct is_convertible
: integral_constant<bool,
- sizeof(internal::ConvertHelper<From, To>::Test(
- internal::ConvertHelper<From, To>::Create()))
- == sizeof(internal::YesType)> {
+ sizeof(internal::ConvertHelper::Test<To>(
+ internal::ConvertHelper::Create<From>())) ==
+ sizeof(internal::YesType)> {
};
-#endif // !defined(OS_WIN)
-
template <typename T>
struct is_class
: integral_constant<bool,