小编Vin*_*ent的帖子

C++:friend declaration'声明一个非模板函数

我有一个问题是重载<<流操作符,我找不到解决方案:

template<class T, unsigned int TN>
class NVector
{
    inline friend std::ostream& operator<< (
        std::ostream &lhs, const NVector<T, TN> &rhs);
};

template<class T, unsigned int TN>
inline std::ostream& NVector<T, TN>::operator<<(
    std::ostream &lhs, const NVector<T, TN> &rhs)
{
    /* SOMETHING */
    return lhs;
};
Run Code Online (Sandbox Code Playgroud)

它会产生以下错误消息:

警告:朋友声明'std :: ostream&operator <<(std :: ostream&,const NVector&)'声明一个非模板函数[-Wnon-template-friend]

错误:'std :: ostream&NVector :: operator <<(std :: ostream&,const NVector&)'必须只有一个参数

如何解决这个问题?

非常感谢你.

c++ gcc templates ostream

5
推荐指数
1
解决办法
7809
查看次数

静态断言检查静态const类数据成员?

我有几个带有"static const"数据成员的类.我想知道如何使用static_assert在编译时检查它们的值.我可以将static_assert直接放在类体中吗?(将static_assert放在每个构造函数中都不太实用.)

c++ class static-assert c++11

5
推荐指数
1
解决办法
694
查看次数

C++:用于operator <<的模板类中的friend函数

在.cpp文件中声明模板类的朋友函数(对于std :: ostream和operator <<)的正确方法是什么?

我当前的实现不起作用:

// MyTest.h
template<class T, unsigned int TSIZE> class MyTest
{
    inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs);
};

// MyTest.cpp
template<class T, unsigned int TSIZE> inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs)
{
    // IMPLEMENTATION
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你 !

c++ templates friend ostream

5
推荐指数
1
解决办法
1428
查看次数

所有类型的零值?

在C++ 11中,有没有办法将算术类和类类型的值初始化为零(算术类型的运行时绝对没有开销)?

template<typename T> void myFunction(T& x)
{
    x = 0; // How to make this works for T = double but also for T = std::string ?
}
Run Code Online (Sandbox Code Playgroud)

c++ initialization zero c++11

5
推荐指数
1
解决办法
1098
查看次数

在函数中推导出参数之前的默认模板参数?

以下编译在g ++中没有问题:

template<typename ReturnType = double, typename OtherType> ReturnType func(const OtherType& var)
{
    ReturnType result = 0;
    /* SOMETHING */
    return result;
}
Run Code Online (Sandbox Code Playgroud)

在默认模板参数(OtherType此处)之后,所有符合标准的编译器是否可以使用非默认模板参数(ReturnType此处)?

c++ templates c++11

5
推荐指数
1
解决办法
102
查看次数

numeric_limits min/max constexpr?

是否C++ 11标准指定的numeric_limits<T>::minmax必须是能够在模板或使用常数表达式static_assert

更一般地说,如何根据标准找到常量表达式的函数列表?

c++ standards-compliance constexpr c++11

5
推荐指数
1
解决办法
1907
查看次数

如何检查迭代器是否形成连续的内存区域?

我目前有以下函数来读取数据或原始数据的向量(_readStream是a std::ifstream):

template<typename IteratorType> 
inline bool MyClass::readRawData(
    const IteratorType& first, 
    const IteratorType& last, 
    typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
    )
{
    _readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
    return _readStream.good();
}
Run Code Online (Sandbox Code Playgroud)

第一个问题:这个功能对你来说好吗?

当我们直接读取内存块,如果从内存块只会工作firstlast是在内存中连续的.怎么检查?

c++ file stream reinterpret-cast contiguous

5
推荐指数
1
解决办法
1125
查看次数

C++设计:具有布尔选项的函数

我在C++中有一个"好的设计实践"的问题.我正在用C++ 11编写一个数值库,我使用了大量的元编程和基于模板的技术.但我有一个非常基本的问题:

考虑一个可以有两个非常接近的行为的函数,除了可以通过布尔标志激活的选项.我只考虑开发人员可以设置/取消设置的标志,而不是可以在运行时设置/取消设置的标志.有3种设计可能性:


1)在名称中使用explicit选项编写两个函数:

myFunctionFlag1(...);
myFunctionFlag2(...); 
Run Code Online (Sandbox Code Playgroud)

2)使用模板参数:

template<bool Flag> myFunction(...);
Run Code Online (Sandbox Code Playgroud)

3)使用变量参数:

myFunction(..., const bool flag);
Run Code Online (Sandbox Code Playgroud)

在良好的设计实践方面,哪种解决方案可接受/不可接受?如果有最佳解决方案,那是哪一个?为什么?如果有一个最糟糕的解决方案,那是哪一个?为什么?

编辑:对于所考虑的函数,运行时开销可以被认为是可以忽略不计的,因此这不是最关键的一点.

编辑2:我知道所有三个工作.但是由于我的图书馆将拥有用户,因此需要有可靠/优秀的设计.

选项2是否常见(因为在我看来这是一个很好的妥协)?

c++ flags boolean

5
推荐指数
1
解决办法
760
查看次数

与类型的二进制表示相关联的技术词是什么?

我目前正在编写一个函数来测试sizeof()C++中的字节序和基本类型,以便检测系统/编译器是"经典"还是非标准.我搜索这个函数的名称,checkSystemSOMETHING()但是我不知道与类型或字节序的二进制表示相关联的单词.什么是最好的替代词SOMETHING

c++ programming-languages terminology endianness

5
推荐指数
1
解决办法
80
查看次数

GCC 4.6和4.7的两个不同结果用于模板模板推导

考虑以下代码:

#include <iostream>
#include <vector>
#include <array>
#include <type_traits>

// Version A
template<typename T>
void f(const T& x)
{
    std::cout<<"Version A"<<std::endl;
}

// Version B
template<typename... T1, template<typename...> class T>
void f(const T<T1...>& x)
{
    std::cout<<"Version B"<<std::endl;
}

// Version C
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N>
void f(const T<T1, N...>& x)
{
    std::cout<<"Version C"<<std::endl;
}

// Main
int main(int argc, char* argv[])
{
    f(double());
    f(std::vector<double>());
    f(std::array<double, 3>());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Windows上的GCC …

c++ gcc templates metaprogramming c++11

5
推荐指数
1
解决办法
252
查看次数