Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ typedef返回模板参数的类型';s成员函数_C++_Templates_Metaprogramming - Fatal编程技术网

C++ typedef返回模板参数的类型';s成员函数

C++ typedef返回模板参数的类型';s成员函数,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我正在尝试typedef模板参数的成员函数的返回类型。比如说: template <typename T> class DoSomething{ typedef return_type (T::*x)(void)const data_type; data_type x1; }; 模板 类剂量{ typedef返回类型(T::*x)(void)常量数据类型; 数据类型x1; }; 在本例中,我想要typedef模板参数的常量成员函数的返回类型,称为x。在本例中,re

我正在尝试
typedef
模板参数的成员函数的返回类型。比如说:

template <typename T>
class DoSomething{
    typedef return_type (T::*x)(void)const data_type;
    data_type x1;
};
模板
类剂量{
typedef返回类型(T::*x)(void)常量数据类型;
数据类型x1;
};
在本例中,我想要
typedef
模板参数的常量成员函数的返回类型,称为
x
。在本例中,
return\u type
只是一个占位符,只是为了显示我想要什么。它不会编译

编辑: 我希望这样做的原因是:在本例中,我希望以与x()成员函数的返回类型相同的精度对x1或任何其他类型的
data\u type
变量执行操作。因此,如果x()返回一个浮点值,我的所有模板操作都将在浮点值中,以此类推


我发现是这样的。但是我不想使用任何C++11特性。所以没有
decltype
,没有
auto
。只需使用C++03编译器即可。

实现这一点的最简单方法可能是boost的typeof,它与decltype类似,但在C++03中工作。

typedef的核心思想如下:

typedef known_type [<modifiers>] new_type;
typedef已知类型[]新类型;
在这种情况下,
known_type
应该已经定义并已知。圆点。没有别的办法。基于此已知的现有类型,可以定义新类型

从这一点开始思考。

这似乎是可行的(即使Boost Typeof被迫长期使用,而不是使用任何C++11或编译器特定的功能):

#包括
#包括
模板
类剂量{
typedef BOOST_TYPEOF_TPL(BOOST::declval().x())数据类型;
数据类型x1;
};

但是结果类型不能涉及任何类、结构、联合或枚举类型。

不清楚您要做什么。
return\u type
x
data\u type
之前是否在任何地方声明过?您能举例说明一下
x1
的用法吗?许多编译器都有特定于编译器的扩展名
typeof
,它或多或少与
decltype
相同。C++11还解决了这么多问题,宁愿绕过问题而不只是使用标准解决方案是荒谬的。@nwp这可能与个人偏好无关,而是与无法影响的外部约束有关。在不尊重他人并使本网站成为一个不那么令人愉快的阅读场所之前,请学会区分这两者。@user4815162342在问题中说“我不想使用任何C++11功能”。我想说的是,这一观点值得重新考虑。“我不允许使用任何C++11特性”是一个完全不同的问题。
#include <boost/utility/declval.hpp>
#include <boost/typeof/typeof.hpp>

template <typename T>
class DoSomething {
    typedef BOOST_TYPEOF_TPL(boost::declval<T const&>().x()) data_type;
    data_type x1;
};