用于定义typedef的变量模板(使用C ++ 98)

时间:2017-05-19 02:49:25

标签: c++ templates typedef c++98

here相同的问题,除了使用C ++ 98:

我刚刚定义了4种不同的typedef,差别很小,我想知道是否有更好的方法来使用模板。

我的typedef格式为:typedef Type1 (*pf)(Type2, Type3, ...)

如何模拟此typedef?

只需要Type1

我手动写道:

typedef int (*pf)(int)
typedef bool (*pf)()
typedef char (*pf)(bool, int)

我正在寻找类似的东西:

template <Type T1,Type...Rest>
typedef T1 (*pf)(Type...Rest)

这是对的吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Boost.Preprocessor在C ++ 98中模拟可变参数模板。幕后实际完成的是预处理器为您编写不同数量参数的模板的所有特化。您现在可以在varadic<...>::type中使用最多256个模板参数的typedef。

使用模板不是一个问题,因为只有实例化的模板进入二进制文件,但对于非模板实体,这可能导致大量的代码膨胀。

#include <iostream>
#include <boost/preprocessor/config/limits.hpp>
#include <boost/preprocessor/repeat.hpp>
#include <boost/preprocessor/facilities/intercept.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>

// Macro to generate specializations
#define MAKE_VARIADIC(Z, N, _)                                          \
  template <                                                            \
    typename R                                                          \
    BOOST_PP_ENUM_TRAILING_PARAMS_Z(Z, N, typename T)                   \
      >                                                                 \
  struct variadic < R BOOST_PP_ENUM_TRAILING_PARAMS_Z(Z, N, T) >        \
  {                                                                     \
    typedef R (*type)(BOOST_PP_ENUM_PARAMS_Z(Z, N, T));                 \
  };

// Declare variadic struct with maximum number of parameters
template <
  typename R
  BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_LIMIT_ITERATION, typename T, = void BOOST_PP_INTERCEPT)
    >
struct variadic;

// Repeat macro to create all specializations
BOOST_PP_REPEAT(BOOST_PP_LIMIT_ITERATION, MAKE_VARIADIC, nil)


// Function to print what was derived
template < typename T >
void print_T()
{
  std::cout << __PRETTY_FUNCTION__ << '\n';
}

// Test
int main ()
{
  print_T< variadic<int, double, float>::type > ();
}

Demo on Wandbox

然而,使用C ++ 11别名模板更方便这种事情,今天在2017年,即标准批准后6年,没有理由不转用C ++ 11。仍然使用C ++ 98有点像仍在使用Windows XP。

#include <iostream>

template <typename R, typename ... Args>
using pf = R(*)(Args...);

// Function to print what was derived
template < typename T >
void print_T()
{
  std::cout << __PRETTY_FUNCTION__ << '\n';
}

// Test
int main ()
{
  print_T< pf<int, double, float> > ();
}

Demo on Wandbox