是否可以模拟模板<auto X>? [英] Is it possible to emulate template&lt;auto X&gt;?

查看:33
本文介绍了是否可以模拟模板<auto X>?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有什么可能吗?我希望它能够在编译时传递参数.假设它只是为了用户方便,因为人们总是可以用 template 打出真正的类型,但对于某些类型,即指向成员函数的指针,这是相当乏味的,即使使用 decltype 作为快捷方式.考虑以下代码:

Is it somehow possible? I want that to enable compile-time passing of arguments. Suppose it's only for user convenience, as one could always type out the real type with template<class T, T X>, but for some types, i.e. pointer-to-member-functions, it's pretty tedious, even with decltype as a shortcut. Consider the following code:

struct Foo{
  template<class T, T X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<int,5>();
  f.bar<decltype(&Baz::bang),&Baz::bang>();
}

是否可以将其转换为以下内容?

Would it be somehow possible to convert it to the following?

struct Foo{
  template<auto X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<5>();
  f.bar<&Baz::bang>();
}

推荐答案

更新后:否.C++ 中没有这样的功能.最接近的是宏:

After your update: no. There is no such functionality in C++. The closest is macros:

#define AUTO_ARG(x) decltype(x), x

f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();

<小时>

听起来你想要一个发电机:


Sounds like you want a generator:

template <typename T>
struct foo
{
    foo(const T&) {} // do whatever
};

template <typename T>
foo<T> make_foo(const T& x)
{
    return foo<T>(x);
}

现在而不是拼写:

foo<int>(5);

你可以这样做:

make_foo(5);

推论论证.

这篇关于是否可以模拟模板<auto X>?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆