In common.h, define func_lib for function objects. In configure.ac, define HAVE_STD_FUNCTION and HAVE_BOOST_FUNCTION. Include function headers in ndnboost.
diff --git a/ndnboost/utility/declval.hpp b/ndnboost/utility/declval.hpp
new file mode 100644
index 0000000..c22154c
--- /dev/null
+++ b/ndnboost/utility/declval.hpp
@@ -0,0 +1,49 @@
+// common_type.hpp ---------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP
+#define BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP
+
+#include <ndnboost/config.hpp>
+
+//----------------------------------------------------------------------------//
+
+#include <ndnboost/type_traits/add_rvalue_reference.hpp>
+//#include <ndnboost/type_traits/add_lvalue_reference.hpp>
+
+//----------------------------------------------------------------------------//
+// //
+// C++03 implementation of //
+// Written by Vicente J. Botet Escriba //
+//~ 20.3.4 Function template declval [declval]
+//~ 1 The library provides the function template declval to simplify the definition of expressions which occur as
+//~ unevaluated operands.
+//~ 2 Remarks: If this function is used, the program is ill-formed.
+//~ 3 Remarks: The template parameter T of declval may be an incomplete type.
+//~ [ Example:
+
+//~ template <class To, class From>
+//~ decltype(static_cast<To>(declval<From>())) convert(From&&);
+
+//~ declares a function template convert which only participats in overloading if the type From can be
+//~ explicitly converted to type To. For another example see class template common_type (20.7.6.6). —end
+//~ example ]
+// //
+//----------------------------------------------------------------------------//
+
+namespace ndnboost {
+
+//#if !defined(BOOST_NO_RVALUE_REFERENCES)
+ template <typename T>
+ typename add_rvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand
+//#else
+// template <typename T>
+// typename add_lvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand
+//#endif
+} // namespace ndnboost
+
+#endif // BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP