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++ 函数中的条件cv限定符_C++_Templates_C++11 - Fatal编程技术网

C++ 函数中的条件cv限定符

C++ 函数中的条件cv限定符,c++,templates,c++11,C++,Templates,C++11,我想使一个方法有条件地常数。就是我们有 template <bool isConst> class A { // stuff }; 或 出现在A的正文中 我的第一个想法是尝试条件类型,但由于显而易见的原因,这不起作用。显而易见的解决方案是专门化: template<bool> struct A { void method() const { std::cout << "const" << std::endl

我想使一个方法有条件地常数。就是我们有

template <bool isConst>
class A {
    // stuff
};

出现在
A
的正文中


我的第一个想法是尝试条件类型,但由于显而易见的原因,这不起作用。

显而易见的解决方案是专门化:

template<bool>
struct A
{
    void method() const
    {
        std::cout << "const" << std::endl;
    }
};

template<>
struct A<false>
{
    void method()
    {
        std::cout << "non-const" << std::endl;
    }
};
模板
结构A
{
void方法()常量
{

std::cout显而易见的解决方案是专门化:

template<bool>
struct A
{
    void method() const
    {
        std::cout << "const" << std::endl;
    }
};

template<>
struct A<false>
{
    void method()
    {
        std::cout << "non-const" << std::endl;
    }
};
模板
结构A
{
void方法()常量
{

std::cout编辑:这只是出于兴趣。我不建议在商业产品中实际这样做。如果你正在尝试一些东西,可能是在个人项目中

你可以做的事情,有点老套,是这样的:

template< bool OnlyConst >
class TestClass
{
  struct Placeholder {};
public:

  template< class T >
  typename std::enable_if< OnlyConst && !std::is_same<T, Placeholder>::value, void >::type 
    MyFunc() const 
  { std::cout << "Const version"; }

  template< class T >
  typename std::enable_if< !OnlyConst && !std::is_same<T, Placeholder>::value, void >::type 
    MyFunc() 
  { std::cout << "Nonconst version"; }
};
模板
类TestClass
{
结构占位符{};
公众:
模板
如果::type,则启用
MyFunc()常量
{std::cout
typename std::enable_如果<!OnlyConst&!std::是相同的::值,void>::type
MyFunc()

{std::coutEDIT:这只是为了兴趣。我不建议在商业产品中实际这样做。如果你正在尝试一些东西,可能是在个人项目中

你可以做的事情,有点老套,是这样的:

template< bool OnlyConst >
class TestClass
{
  struct Placeholder {};
public:

  template< class T >
  typename std::enable_if< OnlyConst && !std::is_same<T, Placeholder>::value, void >::type 
    MyFunc() const 
  { std::cout << "Const version"; }

  template< class T >
  typename std::enable_if< !OnlyConst && !std::is_same<T, Placeholder>::value, void >::type 
    MyFunc() 
  { std::cout << "Nonconst version"; }
};
模板
类TestClass
{
结构占位符{};
公众:
模板
如果::type,则启用
MyFunc()常量
{std::cout
typename std::enable_如果<!OnlyConst&!std::是相同的::值,void>::type
MyFunc()

{std::cout确切的条件是什么?那个方法是
模板结构的一部分吗
?谢谢。我添加了一些说明。确切的条件是什么?那个方法是
模板结构的一部分吗
?谢谢。我添加了一些说明。谢谢!我认为专门化是一种方法;我正在寻找一种快速的方法ner(如
std::conditional
用于
typedef
s)。我认为这可能是唯一的方法。谢谢!我认为专业化是一种方法;我正在寻找一个快速的一行程序(如
std::conditional
用于
typedef
s)。我想这可能是唯一的方法。简而言之,我不知道。至少对于VS2012,我可以调用为:test.MyFunc()编译器似乎很高兴在std::is_same中使用了T。因此,正如我在回答中所说的,这确实意味着编译器在调用时想要知道T,即使它最终没有任何用处。如果可以以某种方式使用T,那么它可以被推导出,调用方不必指定它。或者我不明白你在说什么g?好的,你的回答很有道理,并且为OP提供了另一个想法,所以+1虽然
MyFunc
对我来说仍然有点尴尬:)+1的独创性,但不幸的是,模板化对我来说也有点尴尬。对不起-我一直在试图找到一种可以消除空白的方法。我知道这是一个愚蠢的差事。我不会red有点担心使用或typedef是否会在中派上用场。但是我不认为他们可以做到这一点。无论如何,这是一个有趣的练习。我认为
模板typename std::enable_if::type MyFunc()const
会更干净一些。简而言之,我不知道。至少对于VS2012,我可以调用为:test.MyFunc()编译器似乎很高兴在std::is_same中使用了T。因此,正如我在回答中所说的,这确实意味着编译器在调用时想要知道T,即使它最终没有任何用处。如果可以以某种方式使用T,那么它可以被推导出,调用方不必指定它。或者我不明白你在说什么g?好的,你的回答很有道理,并且为OP提供了另一个想法,所以+1虽然
MyFunc
对我来说仍然有点尴尬:)+1的独创性,但不幸的是,模板化对我来说也有点尴尬。对不起-我一直在试图找到一种可以消除空白的方法。我知道这是一个愚蠢的差事。我不会red有点担心使用或typedef是否会在中派上用场。但是我认为他们无法做到这一点。无论如何,这是一个有趣的练习。我认为
模板typename std::enable_if::type MyFunc()const
会更干净一些。
test.MyFunc<void>(); // even though the void doesn't affect it at all